2013-04-26 154 views
0

我正在嘗試將列表中的元素添加到集合中。例如,如果我有將列表中的元素添加到集合中?

new_list=[['blue','purple'],['black','orange','red'],['green']] 

我怎麼會收到

new_set=(['blue','purple'],['black','orange','red'],['green']) 

我試圖做到這一點,所以我可以用路口找出元素出現在2套。我認爲這會工作...

results=set() 
results2=set() 
for element in new_list: 
    results.add(element) 

for element in new_list2: 
    results2.add(element) 
results3=results.intersection(results2) 

但我不斷收到:

TypeError: unhashable type: 'list' 

出於某種原因。

回答

4

轉換內部名單元組,作爲集允許你只存儲哈希的(immutable)的對象:

In [72]: new_list=[['blue','purple'],['black','orange','red'],['green']] 

In [73]: set(tuple(x) for x in new_list) 
Out[73]: set([('blue', 'purple'), ('black', 'orange', 'red'), ('green',)]) 
3

我怎麼會收到

new_set=(['blue','purple'],['black','orange','red'],['green']) 

好了,儘管誤導性的名稱,那不是set的任何東西,那是tuplelist s。向listlist轉換成listtuple S:

new_set = tuple(new_list) 

也許你想收到此?

new_set=set([['blue','purple'],['black','orange','red'],['green']]) 

如果是這樣......你不能。 A set不能包含像list s這樣的不可取值。這就是TypeError告訴你的。

如果這不是一個問題,所有你需要做的就是寫:

new_set = set(new_list) 

,任何事情變得更復雜,你會寫有完全相同的問題,只是打電話set,所以沒有貓膩繞過它。


當然你也可以有tupleset一個S,因爲他們是哈希的。所以,也許你想這樣:

new_set=set([('blue','purple'),('black','orange','red'),('green')]) 

這也很簡單。假設你的內心list s的保證僅僅包含字符串(或其他可哈希值),在您的例子,它只是:

new_set = set(map(tuple, new_list)) 

或者,如果您使用的是基於排序集類,你不不需要可哈希值,只需要完全有序的值。例如:

new_set = sortedset(new_list) 

Python不附帶的標準庫這樣的事情,但也有一些偉大的第三方實現,你可以安裝,像blist.sortedsetbintrees.FastRBTree

當然,排序集操作並不像散列操作一般快,但通常它們還不夠好。 (對於一個具體的例子,如果你在列表中有1條億件,散列會讓每個查找快100萬次;排序只會使其更快50000次)


基本上,任何輸出可以形容或舉一個例子,我們可以告訴你如何得到那個,或者它不是一個你可以得到的有效對象......但首先你必須告訴我們你實際上想要什麼。


順便說一句,如果你想知道爲什麼list s爲沒有哈希的,這只是因爲他們是可變的。如果你想知道爲什麼大多數可變類型不可散列,那麼the FAQ解釋說。

1

使元素的元組將其添加到之前設置:

new_list=[['blue','purple'],['black','orange','red'],['green']] 
new_list2=[['blue','purple'],['black','green','red'],['orange']] 

results=set() 
results2=set() 
for element in new_list: 
    results.add(tuple(element)) 

for element in new_list2: 
    results2.add(tuple(element)) 

results3=results.intersection(results2) 
print results3 

結果:

set([('blue', 'purple')]) 

集合中的元素必須是哈希的。

  • 添加列出一組,而是使用元組
  • 添加組一組,而是使用frozenset
相關問題