尝试在stackoverflow上进一步适应这个问题:
How to convert a set to a list in python?
我一直在努力解决this riddle on interactivepython.org谜语正好在页面的末尾,它就像是......
我们有一个列表,例如list1 = ['cat','dog','rabbit']
,现在使用列表理解(严格列表理解),我们必须在list1中的每个单词中创建每个字母表的列表,结果列表不应包含重复项。
所以预期的答案是这样的:
['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i']
即使不维持序列也没问题。
现在首先创建一个包含所有字符的列表:
print [word[i] for word in list1 for i in range(len(word))]
并提供输出
['c', 'a', 't', 'd', 'o', 'g', 'r', 'a', 'b', 'b', 'i', 't']
这包括重复
所以我随后将其创建为集合,因为集合不包含重复项:
print set([word[i] for word in list1 for i in range(len(word))])
输出:
set(['a', 'c', 'b', 'd', 'g', 'i', 'o', 'r', 't'])
然而,这会返回一个不是列表的集合,并且可以通过以下方式验证:
type(set([word[i] for word in list1 for i in range(len(word))]))
输出:
<type 'set'>
现在,在上面给出的interactivepython.org链接的视频中,那个人把print
之后的整个内容包含在list()
中,如下所示:
print list(set([word[i] for word in list1 for i in range(len(word))]))
并且他在列表中获得结果输出,但是当我尝试使用使用python 2.7.8的空闲时,我不会得到相同的结果。它反而给了我一个错误:
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
print list(set([word[i] for word in list1 for i in range(len(word))]))
TypeError: 'list' object is not callable
我认为这可能是因为交互式python使用Python 3作为其教程。那么这仅仅是Python 3和Python 2.7之间的区别吗?
另外,如何使用Python 2.7.8实现类似的输出
谢谢
答案 0 :(得分:2)
我们可以使用list(set)将set转换为python 2.7中的列表
>>> a=set([1,2,3])
>>> a
set([1, 2, 3])
>>> b=list(a)
>>> b
[1, 2, 3]
>>>
我认为python 3也具有相同的功能
答案 1 :(得分:0)
所有Python版本都支持通过语法list(<iterable>)
创建列表,因此您的特定Python版本不是错误的原因。
我认为你在the accepted answer中对你提供的链接问题犯了类似的错误,即在交互式shell中你定义了一个名为list
的变量,它隐藏了内置的内容输入list
。
例如,在Python 2.7.6上:
>>> list({1, 2, 3}) # successfully convert a set to a list
[1, 2, 3]
>>> list = [] # shadow the built-in type list
>>> list({1, 2, 3}) # this fails since list no longer references the built-in type
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
尝试退出shell并重新输入它,执行相同的命令,看看它们是否有效。
在不相关的说明中,您可以通过以下方式进一步改善列表生成:
[word[i] for word in list1 for i in range(len(word))]
到此:
[letter for word in list1 for letter in word]
因为遍历字符串会逐个返回其字符。事实上,这也是@JonClements精明解决方案背后的基本逻辑:
list(set().union(*list1))