在Python 2.7.8中将集转换为列表

时间:2014-09-30 02:58:34

标签: list python-2.7 set

尝试在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实现类似的输出

谢谢

2 个答案:

答案 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))