Pythonic方法创build多个列表中包含的所有值的联合

在Python中做一些XML处理。 (编辑:我被迫使用Python 2.4这个项目,嘘!)我想知道什么是最Python的方法来做到这一点(创build多个列表中的所有值的联合):

def getUniqueAttributeValues(xml_attribute_nodes): # split attribute values by whitespace into lists result_lists=list(item.getContent().split() for item in xml_attribute_nodes) # find all unique values unique_results=[] for result_list in result_lists: for result in result_list: if result in unique_results: continue unique_results.append(result) return unique_results 

set.union做你想要的:

 >>> results_list = [[1,2,3], [1,2,4]] >>> results_union = set().union(*results_list) >>> print results_union set([1, 2, 3, 4]) 

你也可以用两个以上的列表来做到这一点。

因为你似乎正在使用Python 2.5(如果你需要一个版本为!= 2.6的版本,那么在你的Q中提到是很好的,顺便说一句,当前的版本),并且需要一个列表而不是一个集合结果,我build议:

  import itertools ... return list(set(itertools.chain(*result_list))) 

itertools通常是使用迭代器(以及许多序列或集合)的好方法,我衷心推荐您熟悉它。 itertools.chain ,特别是在这里logging 。

列表不支持联合列表,这些列表是有序的,但是由集合支持。 退房set.union 。

我用下面的方法来完成交集,这样就避免了设置的需要。

 a, b= [[1,2,3], [1,2]] s = filter( lambda x: x in b, a) 

要么,

 s = [ x for x in b if x in a ] 
 def getUniqueAttributeValues(xml_attribute_nodes): return set(l for item in xml_attribute_nodes for l in item.getContent().split()) 

如果你想拥有一个列表,只需要在返回之前把这个集合转换成一个列表。

你也可以按照这种风格

 In [12]: a = ['Orange and Banana', 'Orange Banana'] In [13]: b = ['Grapes', 'Orange Banana'] In [14]: c = ['Foobanana', 'Orange and Banana'] In [20]: list(set(a) | set(b) | set(c)) Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes'] In [21]: list(set(a) & set(b) | set(c)) Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']