如何从一个集合中获取列表?

64

如何在Python中将set()的内容以list[]形式获取?

我需要这样做是因为我需要在Google App Engine中保存集合,而实体属性类型可以是列表,但不能是集合。我知道我可以遍历整个集合,但似乎应该有一种捷径或“最佳实践”方法来解决该问题。


@Franklin 我倾向于将其关闭为一般参考资料 http://chat.meta.stackoverflow.com/transcript/message/654451#654451 - Trufa
4
@Franklin:我在通用搜索中查找了相关信息,然后在Stackoverflow上发布了主题行的不同变体,以确保它不是重复的。这种信息应该在Stackoverflow.com上得到呈现。 - Chris Dutrow
1
@Franklin:我认为这个并不容易在谷歌上找到。搜索“python set list”或类似的内容会返回更一般的文档。 - Sven Marnach
@Sven Marnach 在前10个谷歌搜索结果中,如果您在交互式控制台中尝试,有2个链接可以帮助您:http://ircarchive.info/python/2007/5/8/76.html和http://www.daniweb.com/software-development/python/threads/93829,但我认为这是一个边缘情况,因为文档不是真正权威的,也不是“非常”容易访问的。 - Trufa
@Sven Marnach:是的,特别是当你正在学习Python时。你会首先查找与“set”相关的方法,例如“add()”和“update()”。当没有类似于“get_list”或“get_iterable”的可用选项时,你会感到沮丧,然后你就不知道该往哪里看了。 - Chris Dutrow
显示剩余14条评论
3个回答

79

查看Sven的回答,但我会使用sorted()函数:这样你可以得到一个漂亮可预测的顺序来获取元素(例如,你之后可以比较列表)。

>>> s = set([1, 2, 3, 4, 5])
>>> sorted(s)
[1, 2, 3, 4, 5]

当然,为使此方法生效,集合元素必须可排序。你不能对复数进行排序(参见gnibbler的注释)。 在Python 3中,您也无法对包含混合数据类型的任何集合进行排序,例如set([1, 2, 'string'])

您可以使用sorted(s, key=str),但在这些情况下可能不值得麻烦。


11
好的,我会尽力进行翻译。下面是需要翻译的内容:"just in case" 的情况下排序并不是个好主意。相比于调用列表,排序的效率更低,但更重要的是——如果集合中的元素无法排序怎么办呢?例如 s=set((1+1j,2+2j,3+3j)) - John La Rooy
谢谢指出!我已经更新了答案,并加入了更多关于此事的信息。 - Petr Viktorin
据我所知,Google App Engine实体仅支持可排序类型。而且个人认为,如果可以以正常形式存储数据,我通常不会太在意多做一些额外的处理...无论如何,这只是一个替代方案,在某些情况下可能会有用。☺ - Petr Viktorin
谢谢。排序后的结果帮助我解决了一个在codeEval上的问题。如果没有使用sorted,它将无法通过一个测试用例。 - AechoLiu

78
>>> s = set([1, 2, 3])
>>> list(s)
[1, 2, 3]
注意,你得到的列表没有定义的顺序。

24
这句话的意思是,list可以接受一个可迭代的参数来填充列表。因此,由于set是可迭代的,所以它产生了期望的效果。 - Chris Morgan

2
>>> a = [1, 2, 3, 4, 2, 3]
>>> b = set(a)
>>> b
set([1, 2, 3, 4])
>>> c = list(b)
>>> c
[1, 2, 3, 4]
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接