2015-11-07 79 views
0

我使用Python 2.6.2的兩個列表的差異獲取新的名單上有差異做一個問題套之間。 我已經創建了三套如下所示:從不同維度

TOT_list = set(xrange(n_unitcells))       
TOT_par = list(set(itertools.product(TOT_list, repeat = 2))) 

導致

TOT_par = [(1, 3), (3, 0), (2, 1), (0, 3), (4, 0), (1, 2), (3, 3), (4, 4), (2, 2), (4, 1), (1, 1), (3, 2), (0, 0), (0, 4), (1, 4), (2, 3), (4, 2), (1, 0), (0, 1), (3, 1), (2, 4), (2, 0), (4, 3), (3, 4), (0, 2)] 

POS_in = [0,0]            
POS_par = [[1,2],[2,3],[3,4]] 

我需要獲得一組新的提取第二種兩套(POS_in和POS_par )從第一個(TOT_par),即類似於:

TOT_new = list(set(TOT_par) - set(POS_in) - set(POS_par)) 

顯然試圖直接使用集之間的差異不起作用。 我試圖寫一些循環,但我只是更困惑...

回答

0

你不是鑄造到set夠深。因爲它包含list S,一個unhashable型

>>> POS_in = [0,0] 
>>> set(POS_in) 
{0} 

set(POS_par)不會在所有的工作。

爲了解決這個問題,給每個list標準結構(嵌套listPOS_par已經將工作良好),轉動每對成tuple,然後打開tuple s'的容器放入一個set

>>> POS_in = [[0,0]] 
>>> POS_in_set = set(map(tuple, POS_in)) 
>>> POS_in_set 
{(0, 0)} 
>>> POS_par = [[1,2],[2,3],[3,4]] 
>>> POS_par_set = set(map(tuple, POS_par)) 
>>> POS_par_set 
{(1, 2), (2, 3), (3, 4)} 

然後你可以做TOT_new = list(set(TOT_par) - POS_in_set - POS_par_set)

+0

它工作完美。謝謝 – Barlume

+0

很高興聽到它。您可以將此答案標記爲已通過單擊其分數下方的「接受」來解決問題。 – TigerhawkT3