我正在读这个: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']
我真正的问题是,这是否是使用此组合的最佳方式?
答案 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.update
(the 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']