我有两个名单说:
a = [1, 2, 2, 2, 3]
b = [2, 5, 6]
做完工会后,我应该得到这样的东西(不要介意订单):
c = [1, 2, 2, 2, 3, 5, 6]
最终列表应仅包含一次公共元素,其余元素(来自两个列表)应按原样复制。集合不能用于此,因为它们从列表中删除多个元素,这不是一个联合。什么是Pythonic方法呢?
答案 0 :(得分:9)
执行联盟,保持重复:
>>> 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]