我将如何收到
new_set=(['blue','purple'],['black','orange','red'],['green'])
好吧,尽管名称具有误导性,但那不是set
任何东西,那是tuple
s list
。要将 a list
of list
s 转换为 a tuple
of list
s:
new_set = tuple(new_list)
也许你想收到这个?
new_set=set([['blue','purple'],['black','orange','red'],['green']])
如果是这样……你不能。Aset
不能包含像list
s 这样的不可散列值。这TypeError
就是告诉你的。
如果这不是问题,您所要做的就是编写:
new_set = set(new_list)
你写的任何更复杂的东西都会遇到和 call 完全相同的问题set
,所以没有什么棘手的方法可以绕过它。
当然你可以有一个set
of tuple
s,因为它们是可散列的。所以,也许你想要这个:
new_set=set([('blue','purple'),('black','orange','red'),('green')])
这也很容易。假设您的 inner list
s 保证只包含字符串(或其他可散列值),就像在您的示例中一样,它只是:
new_set = set(map(tuple, new_list))
或者,如果您使用基于排序的集合类,则不需要可散列值,只需要完全排序的值。例如:
new_set = sortedset(new_list)
Python 的标准库中没有这样的东西,但是你可以安装一些很棒的第三方实现,比如blist.sortedset
或bintrees.FastRBTree
.
当然,排序集操作通常不如散列操作快,但通常它们已经足够好了。(举个具体的例子,如果列表中有 100 万个项目,散列将使每次查找快 100 万倍;排序只会使其快 50,000 倍。)
基本上,您可以描述或给出示例的任何输出,我们都可以告诉您如何获得它,或者它不是您可以获得的有效对象……但首先您必须告诉我们您真正想要什么。
顺便说一句,如果你想知道为什么list
s 不可散列,那只是因为它们是可变的。如果您想知道为什么大多数可变类型不可散列,FAQ对此进行了解释。