gpt4 book ai didi

Python 列表过滤器性能

转载 作者:行者123 更新时间:2023-11-28 21:45:44 24 4
gpt4 key购买 nike

我正在努力

In [21]: l1 = range(1,1000000)

In [22]: l2 = range(100,90000)

In [23]: l1.append(101)

In [24]: print(set([x for x in l1 if l1.count(x) - l2.count(x) == 1]))

在我的 python shell 中,这需要很长时间。一般来说,我的目标是从第二个列表中减去一个列表,同时处理重复项。

例如

[1,2,2,3] - [2,3] = [1,2]

对于如何在常规单核机器上最多 500 毫秒内完成此操作的任何提示,我将非常高兴。

最佳答案

非保序使用collections.Counter:

from collections import Counter

a = Counter([1, 2, 2, 3])
b = Counter([2, 3])
res = list(a - b )
# [1, 2]

这是有效的,因为 Counter- 方法会从输出中删除 b 中的计数等于或大于的任何元素比 a 中的计数。

Order preserving 使用 OrderedCounter,然后手动生成列表,例如:

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
pass

a = OrderedCounter([3, 2, 2, 1])
b = Counter([2, 3])
res = [k for k, v in a.items() if v - b[k] > 0]
# [2, 1]

最后,如果原始范围包含非唯一值,并且您希望元素重复减法后剩余的次数,则:

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
pass

a = OrderedCounter([3, 3, 2, 2, 2, 1])
b = Counter([2, 3])
res = [k for k, v in a.items() for _ in range(v - b[k])]
# [3, 2, 2, 1]

关于Python 列表过滤器性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018238/

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