2013-04-26 78 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
相关问题