2012-07-05 41 views
22

我正在嘗試編寫一段可以自動將因子表達式化的代碼。例如, 如果我有兩個列表[1,2,3,4]和[2,3,5],代碼應該能夠找到兩個列表[2,3]中的公共元素,併合並其餘的元素放在一個新的列表中,[1,4,5]。查找列表中的非常見元素

從這個帖子:How to find list intersection? 我看到共同的元素可以通過

set([1,2,3,4]&set([2,3,5]). 

發現有一種簡單的方法來檢索每個列表非共同的元素,在我的例子是[1,4 ]和[5]?

我可以繼續用於循環做:

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

但這似乎是多餘和低效。 Python是否提供了可以做到的任何方便的功能?提前致謝!!

+0

你想要得到像單獨的列表[1,4]和[5],或者單一個[1,4,5] – nye17 2012-07-05 16:46:47

回答

40

使用對稱差運算符set S(又名XOR運算符):

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

哦哇謝謝! Bue上面的代碼是否需要等量的計算時間和內存空間([1,2,3])&set([3,4,5])?或者它對代碼性能沒有顯着影響? – turtlesoup 2012-07-05 16:14:10

+0

這是實現您的目標的最有效方式。它的複雜度與'&'的順序相同(即集合中元素數量是線性的)。 – Amber 2012-07-05 16:17:23

12

您可以使用交集的概念來處理這類問題。

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

有關使用此代碼的最佳方法是它對於大數據的工作也非常快。當我使用這個邏輯時,我有b1與607139和b2與296029元素,我在2.9秒內得到了我的結果。

0

您可以使用.__xor__屬性方法。

set([1,2,3,4]).__xor__(set([2,3,5])) 

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b)