2

リストのリストがあります。各サブリストには、カスタム クラスのオブジェクトが含まれています。私がやりたいことは、各クラス オブジェクトの特定の属性を 0 に設定することです。これを行う簡単な方法は、double for ループなどです。

for subl in L:
  for myObj in subL:
    myObj.attr = 0

または、次を使用できますitertools.chain

for myObj in itertools.chain.from_iterable(L):
  myObj.attr = 0

しかし、一行ですべてを設定できるかどうかは疑問です。これを行うために、おそらくジェネレーターのような構造を使用できますか? 次のようなもの:

(myObj.attr=0 for subl in L for myObj in subl)

これは実際には機能せず、SyntaxError が発生しますが、リモートで同様のことが可能でしょうか?

4

3 に答える 3

1

これはジェネレーター式の乱用ですが、次のようになります。

any(setattr(obj, "attr", 0) for sub in L for obj in sub)

または、各オブジェクトのテストがないため、おそらくわずかに高速です。

from collections import deque
do = deque(maxlen=0).extend

do(setattr(obj, "attr", 0) for sub in L for obj in sub)
于 2013-10-31T04:33:58.467 に答える
1

これが私の頭に浮かんだ簡単な解決策です。

組み込みのsetattr、あなたの提案 - itertools.chain.from_iterable- 、およびリスト内包表記の乱用を使用します。

class Foo():
    def __init__(self):
        my_attr = 10
A = Foo()
B = Foo()
C = Foo()
D = Foo()

obj_list = [[A, B], [C, D]]
a = [setattr(obj, "my_attr", 0) for obj in itertools.chain.from_iterable(obj_list)]

結果:

>>> a
[None, None, None, None]
>>> A.my_attr
0
>>> B.my_attr
0
>>> C.my_attr
0
>>> D.my_attr
0

このような場合に非常に役立つことがわかりましsetattrた。シンプルで、短く、効果的です。

お役に立てれば!

于 2013-10-31T04:38:10.043 に答える
1

次の例を参照してください。

class C:
def __init__(self):
        self.a = None
    def f(self, para):
        self.a = para

list1 = [C() for e in range(3)]
list2 = [C() for e in range(3)]
list3 = [list1, list2]

[c.f(5) for l in list3 for c in l]

for e in list3:
    for c in e:
        print c.a

結論

属性を設定するメソッドを作成できます。次のようになります。

[myObj.setattr(0) for subl in L for myObj in subl]

括弧に注意してください。

于 2013-10-31T04:35:10.477 に答える