0

MC のインスタンスのリストがあり、属性が 2 に等しいすべてのインスタンスをサブセット化したいと考えています。受け入れるか拒否する値に従ってサブセット化する関数「スーパーファンクション」の作成を手伝ってもらえますか。

class MC(object):
     def __init__(self,smth):
         self.smth=smth

l = [MC(2),MC(4),MC(1),MC(2),MC(2),MC(-3),MC(0)]

def superfunction (a_list,attr,value_to_accept=None, value_to_reject=None):
     return a_subset

辞書ではどのように機能しますか?

どうもありがとう !

4

3 に答える 3

1

特定の例では、次のようなリスト内包表記を使用できます。

return [x for x in a_list if x.smth == 2]

あなたの一般的な例では、同様のことができます:

if value_to_accept is not None:
    return [x for x in a_list if x.smth == value_to_accept]
if value_to_reject is not None:
    return [x for x in a_list if x.smth != value_to_reject]
return []
于 2013-07-30T14:42:49.010 に答える
1

これを行うために必ずしも別の関数が必要なわけではありません。リスト内包表記は非常に単純です。

[mc from l if mc.smth == value_to_accept]
[mc from l if mc.smth != value_to_reject]
于 2013-07-30T14:43:35.327 に答える
1

filter()述語で使用できます:

def superfunction (a_list, attr, value_to_accept=None, value_to_reject=None):
    def predicate(item):
        value = getattr(item, attr)
        if value_to_reject is not None and value != value_to_reject:
            return False
        if value_to_accept is not None and value == value_to_accept:
            return True
        return False

   return filter(predicate, a_list)

これにより、受け入れるか拒否する値を指定できます。

ただし、通常は、関数の代わりにインライン リスト内包表記を使用します。

[elem for elem in a_list if a_list.attr == value_to_accept]
于 2013-07-30T14:46:04.273 に答える