gpt4 book ai didi

python - 高效使用 Python 列表推导式

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:33 30 4
gpt4 key购买 nike

我有一个可能很长的 Python 对象列表。在特定时间,我对列表中具有特定属性(例如 flag)且计算结果为 False 的所有元素感兴趣。为此,我一直在使用列表理解,如下所示:

objList = list()
# ... populate list
[x for x in objList if not x.flag]

这似乎运作良好。形成子列表后,我可能需要执行一些不同的操作:

  1. 下标子列表以获取索引 ind 处的元素。
  2. 计算子列表的长度(即具有 flag == False 的元素的数量)。
  3. 在子列表中搜索特定对象的第一个实例(即使用列表的 .index() 方法)。

我已经使用简单的方法实现了这些,即形成子列表,然后使用它的方法来获取我想要的数据。我想知道是否有更有效的方法来解决这些问题。 #1 和 #3 至少看起来可以优化,因为在 #1 中我只需要子列表的第一个 ind + 1 匹配元素,不一定是整个结果集,在 #3 中我只需要搜索子列表,直到找到匹配的元素。

有没有好的 Pythonic 方法来做到这一点?我猜想我可能能够以某种方式使用 () 语法来获取生成器而不是创建整个列表,但我还没有找到正确的方法。我显然可以手动编写循环,但我正在寻找与基于理解的方法一样优雅的东西。

最佳答案

如果你需要多次执行这些操作,其他方法的开销会更高,列表是最好的方法。它也可能是最清晰的,所以如果内存不是问题,那么我建议直接使用它。

如果内存/速度是个问题,那么还有其他选择 - 请注意,在速度方面,这些选择实际上可能会更慢,具体取决于您的软件的常见情况。

对于您的场景:

#value = sublist[n]
value = nth(x for x in objList if not x.flag, n)

#value = len(sublist)
value = sum(not x.flag for x in objList)

#value = sublist.index(target)
value = next(dropwhile(lambda x: x != target, (x for x in objList if not x.flag)))

使用 itertools.dropwhile()the nth() recipe来自 itertools 文档。

关于python - 高效使用 Python 列表推导式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752208/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com