【问题标题】:How to iterate on a field from a list of objects using for loop?如何使用 for 循环从对象列表中迭代字段?
【发布时间】:2019-05-04 21:39:06
【问题描述】:

抱歉标题不好,但我不知道如何更好地表述它^^。

我要做的是遍历一个对象列表,然后遍历一个list,它是每个对象的成员对象。


所以是这样的:

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 做什么,这将有助于澄清您的问题。甚至可能有一些更肮脏的方法可以在没有双循环的情况下实现它。

标签: python python-3.x


【解决方案1】:

如果你想要一次遍历所有对象的列表,试试这个:

for i in [o.list for o in objects]:
    print(i)

【讨论】:

  • ilist 对象,而不是元素
  • 谢谢,这就是我要找的。​​span>
  • @Graiphers 解决方案实际上更接近我正在寻找的东西
  • 如果你想要每个元素,是的,这是一个更好的解决方案,你应该接受它。
【解决方案2】:

如果你真的不在乎元素来自哪个FooObj,你可以使用itertools.chain.from_iterable

from itertools import chain

for e in chain.from_iterable(o.list for o in objects):
    # Do something for each element
    print(e)

它的优点是它是一个生成器,因此它不会创建任何(可能很大的)中间列表。

【讨论】:

  • 谢谢,也是一个解决方案,但@Akarius 解决方案更短,不需要额外的依赖项。感谢您的帮助!
  • @JakobSachs:请注意,这两个答案给了你不同的东西。这为您提供了列表的元素,而另一个答案只为您提供了您仍需要迭代的列表对象。 itertools 也在标准库中,因此它应该始终可用。
  • 谢谢,是的,我可以看到不同之处。有可能在我的应用程序中它没有任何区别。
  • @JakobSachs:在那种情况下,为什么不直接使用for o in objects: print(o.list)?不需要列表理解。
  • 因为我的“#为每个元素做点什么”不能在列表上发生,而是在每个元素上发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多