我有一份清单清单。每个子列表包含自定义类的对象。我想要做的是将每个类对象的某个属性设置为0.执行此操作的简单方法是双循环或类似:
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,但是甚至可能有类似的东西吗?
答案 0 :(得分: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
对于这样的案例非常有用,它简单,简短,有效。
希望这有帮助!