将列表列表中的元素添加到集合中?

时间:2013-04-26 18:20:16

标签: python list set

我正在尝试将列表列表中的元素添加到集合中。例如,如果我有

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' 

出于某种原因。

3 个答案:

答案 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 listtuple转换为listnew_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.sortedsetbintrees.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')])

设置元素必须是可清除的。

  • 用于向列集添加列表,而不是使用元组
  • 用于将集合添加到集合,而不是使用frozenset