gpt4 book ai didi

python - 在 Python 中从两个列表中查找和删除匹配项

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

所以我有两个 int 列表 xs 和 ys(任意长度)并且想要有效地删除出现在每个列表中的重复项。由于您不能/不应该在循环浏览列表时编辑列表,因此我的尝试是:

matches = [match for match in xs if match in ys]
for match in matches:
xs.remove(match)
ys.remove(match)

但重要的是,如果该值在 xs 中出现两次但在 ys 中出现一次,则会产生错误,因为“if match in ys”对于相同的值两次求值为真,但我需要它只计算一次。

所以澄清一下,如果:

xs = [0, 2, 4, 8, 8, 100]
ys = [1, 3, 5, 8, 8, 8, 10]

然后 8 需要从两个列表中删除两次。

我怎样才能有效地做到这一点?谢谢

编辑:列表不一定有序,实际上两个列表都可能包含重复项。

最佳答案

您可以对交集使用多重集 (collections.Counter)。如果您期望有大量重复项并且您的列表很大,那么建议避免 .remove 因为它很昂贵。列表理解的扩展性要好得多。我们使用一些适度的 itertools 技巧来过滤掉标记的重复项。请注意,这可以进行调整,例如不删除第一个而是最后一个等。

from collections import Counter
from itertools import repeat, chain

xc = Counter(xs)
yc = Counter(ys)
matches = xc & yc
tr = repeat(True)
rm = {k: chain(repeat(False, m), tr) for k, m in matches.items()}
xs = [x for x in xs if not x in rm or next(rm[x])]
rm = {k: chain(repeat(False, m), tr) for k, m in matches.items()}
ys = [y for y in ys if not y in rm or next(rm[y])]

请注意,这仅在您的元素可哈希时才有效。

关于python - 在 Python 中从两个列表中查找和删除匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42613686/

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