2014-12-05 65 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

相關問題