Python:结合两个列表并以函数式编程方式删除重复项

时间:2016-09-27 21:19:48

标签: python functional-programming

我正在尝试编写一个函数,它可以在删除重复项时组合两个列表,但是以纯函数方式。 例如:

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

我尝试了几种方法,但是如果不使用循环来检查项目,就找不到办法 - 我缺少什么?

6 个答案:

答案 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)

如果您不介意导入库,请使用toolzhttp://toolz.readthedocs.io/en/latest/index.html),这通常是使用Python进行函数式编程的一个有价值且广泛使用的帮助程序。它有一个名为uniquehttp://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]