1

同じタイプのオブジェクトのリストから属性を取得する最良の方法はどれだろうと思っていました。for ループよりも効率的なソリューションはありますか? getattr を試しましたが、リストを操作できません。

明確にするためだけに。属性を持つクラス Foo を定義したとしましょうBar

class Foo():
    def __init__(self, Bar):
        self.bar = Bar

A = Foo(5)
B = Foo(6)
C = [A,B]

Bar最終結果が値 [5,6] を持つリストになるように、リスト全体に対して同時に属性を取得するために何かをすることはできますか? ご協力いただきありがとうございます

4

2 に答える 2

10

リストコンプを使用できます:

C = [obj.Bar for obj in (A, B)]

または、次のようにします。

from operator import attrgetter
C = map(attrgetter('Bar'), (A, B))

注: 厳密には「同時に」というわけではありませんが、オブジェクトを 1 つずつループすることは、可能な限り適切です。また、オブジェクトが同じタイプである必要さえないことに注意してください。属性が必要なだけですBargetattr 属性が存在しない場合は、デフォルト値を返すために使用できます。

C = [getattr(obj, 'Bar', None) for obj in (A, B)]

または、デフォルト値の代わりにその属性を持たないアイテムを破棄したい場合:

C = [obj.Bar for obj in (A, B) if hasattr(obj, 'Bar')]
于 2013-06-28T14:21:42.787 に答える
0
C = [getattr(obj, 'Bar') for obj in [A, B]]

あなたも使用することができます:

>>> for nam in dir():
...     obj = eval(nam)
...     if isinstance(obj, Foo):
...        C.append(getattr(obj, 'Bar'))
...
>>> C
[5, 6]
于 2013-06-28T14:36:19.417 に答える