Python中两个列表的合并

9
我有两个列表,如下所示:
a = [1, 2, 2, 2, 3]
b = [2, 5, 6]
经过合并后,我应该得到类似于下面这样的结果(不考虑顺序):
c = [1, 2, 2, 2, 3, 5, 6]
最终列表应仅包含公共元素一次,并且应复制其余元素(来自两个列表)。无法使用集合进行此操作,因为它们会从列表中删除多个出现的元素,这不是一个联合。有什么Pythonic的方法可以做到这一点?

1
你的例子中3怎么样? - loutre
a = [1, 2, 2, 3]; b = [2, 5, 6]; a_set = set(a); c = a + [x for x in b if x not in a_set] / c => [1, 2, 2, 3, 5, 6]a = [1,2,2,3]; b = [2,5,6]; a_set = set(a); c = a + [x for x in b if x not in a_set] / c => [1,2,2,3,5,6] - falsetru
1
如果这是一个正确的多重集合并,你的输出中将有三个2,并包括3。我真的不确定你在尝试做什么;也许你需要重新考虑你的问题。否则,使用itertools.Counter()对象:c = list((Counter(a) + Counter(b)).elements())(或者一直坚持使用Counter()对象)。 - Martijn Pieters
我已经详细阐述了问题。希望现在清楚了。 - Rahul
1个回答

24

执行并集操作,保留重复项:

>>> c = a + b
[1, 2, 2, 3, 2, 5, 6]

执行合并操作,保留重复元素和顺序:

>>> c = sorted(a + b)
[1, 2, 2, 2, 3, 5, 6]

对两个列表进行并集运算,每个列表中不允许重复元素,在最终的并集中允许重复元素,并保持原有顺序:

>>> c = sorted(list(set(a)) + list(set(b)))
[1, 2, 2, 3, 5, 6]
在澄清问题后,目标是构建一个列表,其中包括元素(包括重复的元素),然后将b中不在新列表中的元素添加到其中。
>>> c = a + [e for e in b if e not in a]
[1, 2, 2, 2, 3, 5, 6]
在进一步澄清问题后,目标是构建一个包含输入列表中所有元素的列表。但是,如果元素是相同的,则将它们推到同一个位置。
>>> from collections import Counter
>>> def merge(a,b):
...   na, nb = Counter(a), Counter(b)
...   return list(Counter({k: max((na[k], nb[k])) for k in set(a + b)}).elements())
>>> merge([1, 2, 2, 2, 3], [2, 5, 6])
[1, 2, 2, 2, 3, 5, 6]
>>> merge([1, 2, 3], [2, 2, 4])
[1, 2, 2, 4]

2
这不会给出三个2吗? - Rockybilly
我认为你多了一个 c =。 - Trev Davies
谢谢,问题已解决。我最初以为OP的示例有错误(“3”消失了),但我已经添加了指令以确切地获得所要求的内容。 - aluriak
请问您能否编辑答案?我原本不打算跳过列表c中的第3个,所以最后一部分并不需要了。我已经更新了问题。谢谢 :) - Rahul
所以请使用第二行。您在 OP 中的示例似乎避免了 a 和 b 中的重复(c 中只有两个 2)。 - aluriak
显示剩余7条评论

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