gpt4 book ai didi

python - Python 中的列表理解 : efficient selection in a list

转载 作者:太空狗 更新时间:2023-10-29 20:10:13 24 4
gpt4 key购买 nike

假设我有一个元素列表,我只想根据特定函数(例如到另一个元素的距离)选择其中的一些元素。

我想得到一个包含距离和元素的元组列表。于是,我写了下面的代码

result = [ ( myFunction(C), C) for C in originalList if myFunction(C) < limit ]

但是myFunction是一个非常耗时的函数,而且originalList比较大。这样做,myFunction 将为每个选定的元素调用两次。

那么,有没有办法避免这种情况呢??

我还有另外两种可能,但都不太好:

  1. 第一个是创建未过滤的列表

    unfiltered = [ (myFunction(C),C) for C in originalList ]

    然后排序

    result = [ (dist,C) for dist,C in unfiltered if dist < limit ]

    但在那种情况下,我复制了我的originalList 并浪费一些内存(列表可能会很大 - 更多超过 10,000 个元素)

  2. 第二个是棘手的,不是很 pythonic,但很有效(我们能做的最好的,因为每个元素应该计算一次函数)。 myFunction 最后存储它
    结果是一个全局变量(例如 lastResult),这个值在列表理解

    result = [ (lastResult,C) for C in originalList if myFunction(C) < limit ]

您是否有更好的想法以高效和 Pythonic 的方式实现这一目标??

感谢您的回答。

最佳答案

当然,下面两者的区别:

[f(x) for x in list]

还有这个:

(f(x) for x in list)

是第一个将在内存中生成列表,而第二个是一个新的生成器,具有惰性评估。

因此,只需将“未过滤”列表写成生成器即可。这是您的代码,内联生成器:

def myFunction(x):
print("called for: " + str(x))
return x * x

originalList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
limit = 10
result = [C2 for C2 in ((myFunction(C), C) for C in originalList) if C2[0] < limit]
# result = [C2 for C2 in [(myFunction(C), C) for C in originalList] if C2[0] < limit]

请注意,您不会在两者的打印输出中看到差异,但如果您要查看内存使用情况,则注释掉的第二条语句将使用更多内存。

要对问题中的代码做一个简单的更改,请将 unfiltered 重写为:

unfiltered = [ (myFunction(C),C) for C in originalList ]
^ ^
+---------- change these to (..) ---------+
|
v
unfiltered = ( (myFunction(C),C) for C in originalList )

关于python - Python 中的列表理解 : efficient selection in a list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1222677/

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