2014-12-05 64 views
3

我有两个列表,每个列表包含两个元素列表。如何获得两个元素子列表中的两个列表之间的对称差异?

a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
b = [['Rudolf', '40'], ['Adolf', '50']] 

我想根据子列表的'键'的第一个元素得到两个列表的“对称差异”。

这种“对称差”是以下几点:

c = [['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']] 

所以,“阿道夫”条目已被删除,因为他们在这两个列表中存在,而其他人,包括了“ Rudolf'的参赛作品已被列入,因为它们不在这两份名单中。

另一个例子是以下几点:

a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
b = [['Heinrich', '25']] 
c = [['Adolf', '10'], ['Hermann', '20']] 

我觉得这一定是通过一些巧妙的列表内涵可以实现的,但我不太知道如何处理它。

c = [x for x in a_pairs if x not in b_pairs] 

回答

3

您可以名来自各列表set(第一个元素),然后用^将获得集名称的对称差。然后使用列表理解遍历每个列表并检查名称是否在唯一集合中,然后添加这两个列表推导的结果。

def getDifference(x,y): 
    symDiff = set(i[0] for i in x)^set(i[0] for i in y) 
    return [i for i in x if i[0] in symDiff] + [i for i in y if i[0] in symDiff] 

第一个例子

>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
>>> b = [['Rudolf', '40'], ['Adolf', '50']] 
>>> getDifference(a,b) 
[['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']] 

第二个例子

>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
>>> b = [['Heinrich', '25']] 
>>> getDifference(a,b) 
[['Adolf', '10'], ['Hermann', '20']] 
+0

这是伟大的。非常感谢您的帮助。我没有意识到集合的漂亮功能! – d3pd 2014-12-07 02:11:24

+1

正如一个侧面说明,'symmetric_difference()'也是[set method](https://docs.python.org/3/library/stdtypes.html?highlight=set#set.symmetric_difference)。如果设置了a和b,对称差可以通过a.symmetric_difference(b)或b.symmetric_difference(a)来返回。 – dagrha 2016-02-02 06:03:32

相关问题