2012-06-20 116 views
2

我是一個Python新手,剛剛學習的東西,因爲我做我的項目,在這裏我有兩個列表,我需要比較和分開在A - > B和diff發現b - > A 比較的最佳方法是什麼?在Python中有效比較列表的兩個列表

A=[[1L, 'test_case_1'], [1L, 'test_case_2'], [2L, 'test_case_1']] 
B=[[1L, 'test_case_1'], [1L, 'test_case_4'], [2L, 'test_case_1'], [2L, 'test_case_3']] 
+0

這並不是一個非常好的數據結構來進行有效比較。如果你有*元組清單*,你可以將其轉換爲一個集合。這個小小的變化可以讓你在線性時間內進行比較 –

回答

4

假設你可以使用列表元組根據我的評論,這個Junuxx的答案的簡單修改是更多的e fficient

A - B:

>>> setb = set(B) 
>>> [x for x in A if not x in setb] 
[(1L, 'test_case_2')] 

乙 - 答:

>>> seta = set(A) 
>>> [x for x in B if not x in seta] 
[(1L, 'test_case_4'), (2L, 'test_case_3')] 
+0

我也看到了你的其他答案,關於Python的快速計算方法。你有沒有更多的這些博客? – codecool

+0

@codecool,對不起沒有博客。也許我應該開始一個 –

+0

你應該做一個! :) – codecool

2

你可以用一個列表理解這樣做很容易,

A - B:

>>> [x for x in A if not x in B] 
[[1L, 'test_case_2']] 

乙 - 答:

>>> [x for x in B if not x in A] 
[[1L, 'test_case_4'], [2L, 'test_case_3']] 
0

只需使用List Comprehension

A - B:

>>>[p for p in A if p not in B] 
[[1L, 'test_case_2']] 

乙 - 答:

>>>[p for p in B if p not in A] 
[(1L, 'test_case_4'), (2L, 'test_case_3')] 

的一個快速方法:首先可以使Bset(),然後用Generator

對於A - B:

>>>B = [(l[0], l[1]) for l in B] 
>>>set_b = set(B) 
>>>(p for p in A if p not in set_b) 
<generator object <genexpr> at 0x00BCBBE8> 
+0

你有試過嗎? 'set(B)'導致'TypeError:不可用類型:'list''。 – Junuxx

+0

@Junuxx首先應該把'B'轉換成''元組列表' – shihongzhi