我正在尝试将列表列表中的元素添加到集合中。例如,如果我有
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'
出于某种原因。
答案 0 :(得分:4)
将内部列表转换为元组,因为集合允许您只存储可散列(不可变)对象:
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',)])
答案 1 :(得分:3)
我将如何收到
new_set=(['blue','purple'],['black','orange','red'],['green'])
嗯,尽管有误导性的名称,但这不是set
的任何内容,而是tuple
list
。要将list
list
个tuple
转换为list
个new_set = tuple(new_list)
:
new_set=set([['blue','purple'],['black','orange','red'],['green']])
也许你想收到这个?
set
如果是这样......你不能。 list
不能包含TypeError
之类的不可用值。这就是new_set = set(new_list)
告诉你的。
如果这不是问题,那么你所要做的就是写:
set
你编写的任何更复杂的问题与调用set
都有完全相同的问题,因此没有什么棘手的方法。
当然,你可以拥有tuple
new_set=set([('blue','purple'),('black','orange','red'),('green')])
个,因为它们可以播放。所以,也许你想要这个:
list
这也很简单。假设你的内部new_set = set(map(tuple, new_list))
被保证只包含字符串(或其他可混合值),就像在你的例子中那样只是:
new_set = sortedset(new_list)
或者,如果使用基于排序的集合类,则不需要可输入值,只需要完全排序的值。例如:
list
Python在标准库中没有这样的东西,但是你可以安装一些很棒的第三方实现,比如blist.sortedset
或bintrees.FastRBTree
。
当然,排序集操作并不像一般的哈希操作那么快,但通常它们已经足够好了。 (举一个具体的例子,如果列表中有100万个项目,散列将使每个查找速度提高100万倍;排序只会使其快5万倍。)
基本上,你可以描述或给出一个例子的任何输出,我们可以告诉你如何得到它,或者它不是你可以获得的有效对象......但首先你必须告诉我们你真正想要的东西。
顺便说一句,如果你想知道为什么{{1}}不能清洗,那只是因为它们是可变的。如果您想知道为什么大多数可变类型都不可清除,the FAQ解释了这一点。
答案 2 :(得分: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')])
设置元素必须是可清除的。