怎么做几个列表的联合?

时间:2018-01-02 15:09:19

标签: python list

我正在读这个:Combining two lists and removing duplicates, without removing duplicates in original list但我的需要超越了。我有至少30个列表,我需要联合而不重复所有列表。现在我的第一次尝试只是使用+将所有成员附加到一个很棒的列表中然后使用set来删除重复项,但我不确定这是否是最佳解决方案:

修改 - 添加样本

list_a = ['abc','bcd','dcb']
list_b = ['abc','xyz','ASD']
list_c = ['AZD','bxd','qwe']
big_list = list_a + list_b + list_c
print list(set(big_list)) # Prints ['abc', 'qwe', 'bcd', 'xyz', 'dcb', 'ASD', 'bxd']

我真正的问题是,这是否是使用此组合的最佳方式?

4 个答案:

答案 0 :(得分:3)

如果我理解你正在尝试做什么,你可以使用set.update方法和任意数量的可迭代参数。

>>> lists = [[1,2,3], [3,4,5], [5,6,7]]
>>> result = set()
>>> result.update(*lists)
>>> 
>>> result
{1, 2, 3, 4, 5, 6, 7}

编辑:使用您的示例数据:

>>> list_a = ['abc','bcd','dcb']
>>> list_b = ['abc','xyz','ASD']
>>> list_c = ['AZD','bxd','qwe']
>>> 
>>> result = set()
>>> result.update(list_a, list_b, list_c)
>>> result
{'ASD', 'xyz', 'qwe', 'bxd', 'AZD', 'bcd', 'dcb', 'abc'}

答案 1 :(得分:2)

使用set.union(set1, set2, set3, ..)

>>> l1 = [1,2,3]
>>> l2 = [2,3,4]
>>> l3 = [3,4,5]
>>> set.union(*[set(x) for x in (l1, l2, l3)])
{1, 2, 3, 4, 5}

更紧凑(适用于Py2和Py3,谢谢@Lynn!):

>>> set.union(*map(set, (l1, l2, l3)))
set([1, 2, 3, 4, 5])

答案 2 :(得分:1)

使用set.union的一种方法有already been mentioned,尽管在首次将列表映射到set个实例后应用于每个列表。

作为替代方案,可以省略显式set映射,因为set.union非常类似set.updatethe accepted answer中涵盖的后一种方法)也可以使用任意数量的set.union可迭代的参数,允许直接在空集和提供的列表上调用>>> list_a = ['abc','bcd','dcb'] >>> list_b = ['abc','xyz','ASD'] >>> list_c = ['AZD','bxd','qwe'] >>> result = set().union(list_a, list_b, list_c) >>> result {'ASD', 'xyz', 'qwe', 'bxd', 'AZD', 'bcd', 'dcb', 'abc'}

"

答案 3 :(得分:0)

你可以做的是创建一个接受任意数量列表的函数,展平它们并返回联合:

from itertools import chain

def union_lists(*iterables):
    union = []
    lookup = set()

    flattened = chain.from_iterable(iterables)

    for item in flattened:
        if item not in lookup:
            lookup.add(item)
            union.append(item)

    return union

上述功能的好处是它可以在插入列表项时保留它们的顺序,而不像set()这是无序的。然而,它使用set()来检查是否已添加项目,O(1),但是将它们插入到列表中,因为列表是有序的。

它还使用itertools.chain.from_iterable将列表展平为O(n)

然后您可以根据需要在任意数量的列表上运行此功能:

>>> list_a = ['abc','bcd','dcb']
>>> list_b = ['abc','xyz','ASD']
>>> list_c = ['AZD','bxd','qwe']
>>> print(union_lists(list_a, list_b, list_c))
['abc', 'bcd', 'dcb', 'xyz', 'ASD', 'AZD', 'bxd', 'qwe']
>>> list_d = ['bcd', 'AGF', 'def']
>>> print(union_lists(list_a, list_b, list_c, list_d))
['abc', 'bcd', 'dcb', 'xyz', 'ASD', 'AZD', 'bxd', 'qwe', 'AGF', 'def']