【问题标题】:Storing Objects in a List in Python在 Python 中将对象存储在列表中
【发布时间】:2019-10-28 13:42:54
【问题描述】:

如果存在带有变量 .X 的对象

randomData.X 

是创建的对象。如果多个对象存储在一个列表中,并且可以通过

randomList[3].X

有没有办法从列表中提取 X 的所有值,而无需遍历列表中的每个对象,如下所示:

for x i range(0,10)
randomList[x].X

【问题讨论】:

  • 没有。没有。您必须以一种方式或另一种方式循环,list 对象不支持矢量化属性访问或任何矢量化操作。尽管在这种情况下(大多数情况下),您应该直接遍历列表:for item in randomList: item.X
  • 您是在问是否可以拉取少于整个lists 的价值Xs,或者如何有效地拉取Xs?

标签: python list loops object variables


【解决方案1】:

您可能正在寻找列表推导式。

[obj.X for obj in randomList]

这会生成一个列表,其中包含对象列表中每个对象的所有属性 X。

请记住,循环遍历列表是不可避免的。这只是与以前相同的循环的语法糖。

【讨论】:

  • 我怀疑这就是 OP 所追求的,但可能值得一提的是,它仍然遍历每个项目——这只是一种更简洁的方式。
  • 编辑了我的答案
  • 非常感谢。也许以这种对象格式存储大量数据并不是最有效的,因为我需要在数据中进行大量搜索。
【解决方案2】:

如果您正在寻找更大的lists 上的最大效率,在这种情况下,list 理解的替代方法是使用map + operator.attrgetter。您可以直接遍历map

from operator import attrgetter

for X in map(attrgetter('X'), randomList):

不涉及临时的listmap 在 Python 3 中根据需要延迟拉取项目),或者如果您确实需要 list,只需包装在 list 构造函数中或使用 list 解包运行迫不及待的说出来:

Xs = list(map(attrgetter('X'), randomList))
# or
Xs = [*map(attrgetter('X'), randomList)]

对于小输入 lists,这将比 list 理解慢(它的设置开销略高),但对于中到大输入,它会更快(每项开销略更低,因为它不涉及每个项目的字节码执行)。

为了清楚起见,它仍然需要遍历list。没有神奇的方法可以在不循环的情况下获取list 中每个项目的属性;您可以不遗余力地创建 list 的视图,从底层 list 无缝读取属性,但如果您访问该视图的每个元素,它将相当于工作中所需的循环。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 2012-10-08
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2012-01-13
    • 2017-12-09
    相关资源
    最近更新 更多