2016-07-15 47 views
-2

當使用set()函數將列表轉換爲Python中的集合時,Python會嘗試通過從列表中刪除重複的值來簡化集合,如下例所示。在Python中的列表到集轉換期間保留列表值

In [1]: list = [1,4,1] 

In [2]: list 
Out[2]: [1, 4, 1] 

In [3]: set = set(list) 

In [4]: set 
Out[4]: {1, 4} 

此使用集時,計算該列表的屬性和轉換回,​​如在下面的矢量減法例子是不方便的。

In [1]: a = [1,1,1] 

In [2]: a 
Out[2]: [1, 1, 1] 

In [3]: b = [1,2,3] 

In [4]: b 
Out[4]: [1, 2, 3] 

In [5]: list(set(a) - set(b)) 
Out[5]: [] 

很明顯出了點問題:我們期待的操作{1-1, 1-2, 1-3} = {0, -1, -2}。相反,我們有以下存儲的值。

In [6]: set(a) 
Out[6]: {1} 

In [7]: set(b) 
Out[7]: {1, 2, 3} 

這意味着我們正在計算{1-1, ?-2, ?-3} = ?,這是無法完成的。

有沒有辦法在轉換爲集合時保留列表的結構和值以避免此問題?

顯然我不是在談減法列表:我在談論減法集。

+0

爲什麼你需要設置一個向量減法? –

+0

爲什麼你期待減法轉換爲數字減法? [集合文檔](https://docs.python.org/2/library/stdtypes.html#set.difference)清楚地表明'-'用於*集合差異*。 'set(a)--set(b)'中的任何元素產生一個* new *集合,其中'set(a)'中的所有元素都不會出現在'set(b)'中。由於'set(a)'只包含'1','set'也在'set(b)'中,所以你會得到一個空集。 –

+0

向量不是集合,集合是向量操作的*錯誤工具*。 –

回答

0

在這種情況下,我看不到需要set。你可以只zip的名單,並做這樣的減法

>>> a = [1,1,1] 
>>> b = [1,2,3] 
>>> [x-y for x,y in zip(a,b)] 
[0, -1, -2] 
+2

你不需要顯式轉換爲'list' –

+0

@MosesKoledoye謝謝,編輯 –

+0

或者根本不要試圖重新發明輪子:) - https://gist.github.com/mcleonard/5351452 – DeepSpace