How to iterate on a field from a list of objects using for loop?
抱歉,标题不好,但我不知道如何更好地表述它。
我要做的是迭代对象列表,然后迭代每个对象的成员列表。
所以像这样:
1 2 3 4 5 6 7 8 9
| class FooObj:
def __init__(self):
self.list = [1,"Hello", 3.4] #some list thats unique for each object
objects = [...] # some list of FooObj's
for o in objects:
for e in o.list:
# Do something for each list element |
这就是我"传统"的做法。我感兴趣的是是否有一种方法可以将两个for循环凝结成一个?
谢谢你的帮助^^
- 取决于你想做什么。如果要检索list的list,可以考虑使用list comprehension。但是,如果您确实在子列表上执行某些操作,那么您也可以坚持这一点。无论哪种方式,您都必须遍历对象列表和属性列表。
- 这取决于您对每个列表元素所做的操作。可能有2个for循环是最好的方法。例如,您可以使用列表理解来组合两个for循环,但只有在您试图构建列表时才建议这样做。
- 如果你能举例说明你想用list做什么,这将有助于澄清你的问题。可能有一些更脏的方法来实现它,甚至不需要使用双循环。
如果您真的不在乎元素来自哪个FooObj,您可以使用itertools.chain.from_iterable:
1 2 3 4 5
| from itertools import chain
for e in chain.from_iterable(o.list for o in objects):
# Do something for each element
print(e) |
它的优点是它是一个生成器,因此它不会创建任何(可能很大)中间列表。
- Thanks,also a solution,but@akarius solution is shorter and doesn't require additional dependencies.请欣赏帮助思考!
- @Jakobsachs:note that the two answer give you different things.This gives you the elements of the lists,while the other answer only gives you the list objects over which you still need to iterate.Also EDOCX1 0 animal is in the Standard Library,so it should be always available.
- a Thanks yes I can see the difference.Chance has it that in my application it doesn't make a difference.
- @Jakobsachs:in that case why not do EDOCX1 commercially?No list comprehension needed.
- Because my"-35;do some thing for each element"Cant happen on a list but on each element
如果您希望一次遍历所有对象的列表,请尝试以下操作:
1 2
| for i in [o.list for o in objects]:
print(i) |
号
- EDOCX1是The EDOCX1的英文字母3,而不是一个元素
- Thanks,this is what I'm looking for.
- @Graiphers solution is actually closer to what im looking for
- 如果你想要得到的选择,是的,这是一个更好的解决办法,你应该接受它。