Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表中的元素添加到集合中?_Python_List_Set - Fatal编程技术网

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

Python 将列表中的元素添加到集合中?,python,list,set,Python,List,Set,我正在尝试将列表列表中的元素添加到集合中。例如,如果我有 new_list=[['blue','purple'],['black','orange','red'],['green']] 我将如何收到 new_set=(['blue','purple'],['black','orange','red'],['green']) 我正试图这样做,这样我就可以使用交集来找出哪些元素出现在两个集合中。我想这会有用的 results=set() results2=set() for element in

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

new_list=[['blue','purple'],['black','orange','red'],['green']]
我将如何收到

new_set=(['blue','purple'],['black','orange','red'],['green'])
我正试图这样做,这样我就可以使用交集来找出哪些元素出现在两个集合中。我想这会有用的

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' 

出于某种原因。

将内部列表转换为元组,因为集合只允许存储可散列(不可变)对象:

我将如何收到

new_set=(['blue','purple'],['black','orange','red'],['green'])
好吧,尽管名称有误导性,但这不是任何东西的
集合,而是
列表的
元组。要将
列表
列表
转换为
列表
元组
,请执行以下操作:

new_set = tuple(new_list)

也许你想收到这个

new_set=set([['blue','purple'],['black','orange','red'],['green']])
如果是的话……你不能。
set
不能包含像
list
s这样的不可损坏的值。这就是
TypeError
告诉您的

如果这不是问题,您所要做的就是写:

new_set = set(new_list)
而您编写的任何更复杂的代码都会遇到与调用
set
完全相同的问题,因此没有任何棘手的解决方法


当然,您可以有一个
集合
元组,因为它们是可散列的。所以,也许你想要这个:

new_set=set([('blue','purple'),('black','orange','red'),('green')])
那也很容易。假设您的内部
列表
s保证只包含字符串(或其他可散列值),如您的示例所示,它只是:

new_set = set(map(tuple, new_list))

或者,如果使用基于排序的集合类,则不需要哈希值,只需要完全排序的值。例如:

new_set = sortedset(new_list)
Python在标准库中没有这样的东西,但是您可以安装一些很棒的第三方实现,比如或

当然,排序集操作通常不如散列操作快,但通常它们已经足够好了。(举个具体的例子,如果列表中有100万项,哈希将使每次查找速度加快100万倍;排序只会使查找速度加快50000倍。)


基本上,任何你可以描述或给出一个例子的输出,我们可以告诉你如何得到它,或者它不是一个你可以得到的有效对象……但是首先你必须告诉我们你真正想要什么



顺便说一下,如果你想知道为什么
list
s不可散列,那只是因为它们是可变的。如果您想知道为什么大多数可变类型都不可散列,请解释。

在将元素添加到集合之前将其设置为元组:

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')])
集合元素必须是可散列的

  • 要将列表添加到集合中,请改用tuple
  • 要将集合添加到集合中,请改用frozenset
set([('blue', 'purple')])