2017-01-01 31 views
0

我有2个清单的下面的形式:联盟2列出的

list1 = [["abc",45,48],["def",13,16]] 
    list2 = [["efgh",67,71],["def",13,16]] 

我怎样才能找到这些2所列出的工会吗?

需要的输出:

union_list = [["abc",45,48],["def",13,16],["efgh",67,71]] 

如果这可以帮助:正如你所看到的,list[0][1]list[0][2]integers,我们在必要时它强制转换为string

+0

[Pythonic方式创建多个列表中包含的所有值的联合]的可能副本(http://stackoverflow.com/questions/2151517/pythonic-way-to-create-union-of-all-values-contained -in-multiple-lists) – Li357

回答

2

您可以使用set.union,也就是说,你可以两个列表映射到元组的列表,然后将它们转换成集,这样就可以调用union方法:

u_set = set(map(tuple, list1)).union(map(tuple, list2)) 

# {('abc', 45, 48), ('def', 13, 16), ('efgh', 67, 71)} 

要将它们转换回列表:

list(map(list, u_set)) 
# [['def', 13, 16], ['efgh', 67, 71], ['abc', 45, 48]] 
1

您可以使用集合理解。由于列表是不可排序的,所以必须使用tuple()

>>> list1 = [["abc",45,48],["def",13,16]] 
>>> list2 = [["efgh",67,71],["def",13,16]] 
>>> {tuple(sublist) for sublist in list1 + list2} 
set([('def', 13, 16), ('efgh', 67, 71), ('abc', 45, 48)]) 
>>> 
1

您可以使用

[list(x) for x in unique_everseen(tuple(y) for y in chain(list1, list2))] 

unique_everseen()可以在模块itertools的文档中找到。转换为元组是必要的,因为列表类型不可哈希。

+0

在itertools库中找到'chain()'。显示您导入的功能通常是一个好主意,而不是仅仅使用它们。另外,每个功能的文档链接都不会受到影响。 –

+0

@leaf我添加了itertools文档的链接。请注意,unique_everseen不包含在itertools中,它被记录为(有用的)配方。 – Gribouillis