列表中列表的常见元素

3

我有两个列表的列表

a = [(468, 15), (336, 280), (200, 90), (180, 150), (180, 150), (180, 150)]
b = [(200, 200), (200, 90), (200, 90), (180, 150), (180, 150)]

我想找到两个列表中相同的元素并将它们删除。在a列表中,b [0]不存在,只有 b [1] & b [2]其中一个存在于a列表中,b [3]b [4]都存在于a列表中。

我需要把每个列表中的最大出现次数发送到另一个列表(其他出现次数计算为重复),即我需要这个作为输出结果。

combined = [(468, 15), (336, 280), (200, 200), (200, 90), (200, 90), (180, 150), (180, 150), (180, 150)]

注意:我已经阅读了解决方案,但它们将这些列表转换为“集合”,这会消除“重复”出现的情况。
有没有简单的方法可以做到这一点?
编辑:如何生成输出的解释
(468, 15) 在a中出现1次。 (336, 280) 在a中出现1次。 (200, 200) 在b中出现1次。 (200, 90) 在a中出现1次,在b中出现2次。 (180, 150) 在a中出现3次,在b中出现2次。
输出是两个列表之间最大的出现次数,即
(468, 15) 一次。 (336, 280) 一次。 (200, 200) 一次。 (200, 90) 两次。 (180, 150) 三次。
将列表组成给定的combined列表。

项目的顺序是否重要? - Rustam Garayev
@RustamGarayev 不,他们不这样做。 - Nilima
4个回答

4

由于顺序不重要,您可以将所有项目放入集合中,并添加每个项目的最大出现次数:

a = [(468, 15), (336, 280), (200, 90), (180, 150), (180, 150), (180, 150)]
b = [(200, 200), (200, 90), (200, 90), (180, 150), (180, 150)]

res = [each for each in set(a + b) for i in range(max(a.count(each), b.count(each)))]

res 会长这样:

[(180, 150), (180, 150), (180, 150), (200, 200), (468, 15), (336, 280), (200, 90), (200, 90)]

太棒了!谢谢@Rustam Garayev!您能告诉我这个理解是如何实现它的吗? - Nilima
@Nilima 首先,第一个循环在两个列表的组合中寻找每个唯一元素,而第二个循环确定每个元素应该被添加到最终列表中的次数。 - Rustam Garayev

2

一个选项是使用collections.Counter。至少在我看来,这最符合我对问题的思考:

from collections import Counter

ca = Counter(a)
cb = Counter(b)

result = [
    element  # every element
    for element in ca | cb  # that is in either input
    for _ in range(max(ca[element], cb[element]))  # the larger amount of times it occurs
]

当你的元素是可哈希的(可以作为字典中的键或集合中的元素)时,这当然是有效的。

2
“not the fastest” 肯定比为每个单独元素调用 count 更快。对于平铺,您还可以使用 [x for x in ca | cb for _ in range(max(ca[x], cb[x]))] - tobias_k
@tobias_k 不错!出于某种原因,我认为如果我手动展开它,它可能会看起来更笨重,但由于Counter.__missing__max()很好地组合在一起,情况并非如此。 - L3viathan

1

try this:

a = [(468, 15), (336, 280), (200, 90), (180, 150), (180, 150), (180, 150)]
b = [(200, 200), (200, 90), (200, 90), (180, 150), (180, 150)]


[[d] * max(a.count(d), b.count(d)) for d in set(a+b)]

1
@Nilima,这是给您的最短回答:))) - I'mahdi
1
是的 :) 这非常优雅!我希望我能在这里给2个绿色的勾。 - Nilima

0
以上问题可以通过添加列表并删除重复项来解决。
以下是示例:
a = [(468, 15), (336, 280), (200, 90), (180, 150), (180, 150), (180, 150)]
b = [(200, 200), (200, 90), (200, 90), (180, 150), (180, 150)]
mylist = list(dict.fromkeys(a+b))
print(mylist)

它返回[(468, 15), (336, 280), (200, 90), (180, 150), (200, 200)],但OP要求输出应为[(468, 15), (336, 280), (200, 200), (200, 90), (200, 90), (180, 150), (180, 150), (180, 150)] - Ghost Ops
@RMR 我不想使用字典或集合,因为它们会减少我的列表 - 这是我不想要的。 - Nilima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接