我正在尝试编写一个函数,它可以在删除重复项时组合两个列表,但是以纯函数方式。 例如:
a = [1,2,2]
b = [1,3,3,4,5,0]
union(a,b) --> [1,2,3,4,5,0]
代码的命令形式是:
def union(a,b):
c = []
for i in a + b:
if i not in c:
c.append(i)
return c
我尝试了几种方法,但是如果不使用循环来检查项目,就找不到办法 - 我缺少什么?
答案 0 :(得分:3)
您是否尝试过使用sets
?
>>> a = [1,2,2]
>>> b = [1,3,3,4,5,0]
>>> list(set(a).union(set(b)))
[0, 1, 2, 3, 4, 5]
答案 1 :(得分:1)
如果您想保留订单,可以使用collections.OrderedDict
,否则只需使用set
。这些数据结构使用其项目的哈希值来保留它们,因此它们不会保留重复项。
In [11]: from collections import OrderedDict
In [12]: list(OrderedDict.fromkeys(a+b))
Out[12]: [1, 2, 3, 4, 5, 0]
答案 2 :(得分:0)
结合两个列表:
a = [1,2,2]
b = [1,3,3,4,5,0]
使用集合:
union = set(a) | set(b)
# -> set([0, 1, 2, 3, 4, 5])
使用理解列表:
union = a + [x for x in b if x not in a]
# -> [1, 2, 2, 3, 3, 4, 5, 0]
使用循环,没有重复,保留顺序:
union = []
for x in a + b:
if x not in union:
union.append(x)
# -> [1, 2, 3, 4, 5, 0]
答案 3 :(得分:0)
怎么样
>>> x = [1,2,3]
>>> y = [1,3,5,7,9]
>>> list(set(x).union(set(y)))
答案 4 :(得分:0)
list(set(a+b))
这结合了两个列表a和b,并且使用set只接受唯一的值,然后我们可以将它返回列表。
答案 5 :(得分:0)
如果您不介意导入库,请使用toolz
(http://toolz.readthedocs.io/en/latest/index.html),这通常是使用Python进行函数式编程的一个有价值且广泛使用的帮助程序。它有一个名为unique
(http://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.unique)的函数,它完全符合您的要求。
from toolz.itertoolz import unique
a = [1,2,2,3,0]
b = [1,3,3,4,5,0]
c = a + b # could do that with itertools.chain() in a more functional way
return list(unique(c))
# -> [1, 2, 3, 0, 4, 5]