如何在python中将集合转换为列表?


143

我正在尝试将一组转换为Python 2.6中的列表。我正在使用以下语法:

first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

但是,我得到以下堆栈跟踪:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'set' object is not callable

我怎样才能解决这个问题?


2
在Linux上的Python 2.6.6上对我有效...但是第一行没有创建集合。
2011年

2
根据TypeError: 'set' object is not callable:是什么set?谢谢

13
您已经遮盖了内置的设置。也许您不小心输入了set=set(first_list)什么。现在set已重新定义到此设置对象,这将导致该错误。使用新鲜的Python解释器再试一次
John La Rooy

3
@gnibbler:您应该将其作为答案,因为很明显这确实破坏了它。
克里斯·摩根

2
问题已被编辑以纠正问题,这太糟糕了。看到正确的代码以及随后将不会生成的错误令人困惑。实际上,编辑之前的原始问题也不会导致显示错误。我怀疑这是复制和粘贴错误。
LS

Answers:


194

已经是清单了

type(my_set)
>>> <type 'list'>

你想要类似的东西吗

my_set = set([1,2,3,4])
my_list = list(my_set)
print my_list
>> [1, 2, 3, 4]

编辑:您的最后评论的输出

>>> my_list = [1,2,3,4]
>>> my_set = set(my_list)
>>> my_new_list = list(my_set)
>>> print my_new_list
[1, 2, 3, 4]

我想知道您是否做了这样的事情:

>>> set=set()
>>> set([1,2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object is not callable

4
当我输入type(my_set)时,我得到<type'set'>
gath

2
@gath,那是在您编辑代码之前。您当前的代码在我的机器上可以正常工作。你能尝试复制粘贴到这一个Python解释器,因为它是在这里贴上输出
用户

1
试试这个:>>> my_list = [1,2,3,4] >>> my_set = set(my_list)>>> my_new_list = list(my_set)追溯(最近一次调用):文件“ <控制台>”, <module> TypeError中的第1行:'set'对象不可调用
gath

1
我敢打赌他不小心将名称“ set”绑定到{1,2,3}或[1,2,3]或类似的名称。(因为我在实验时不小心做了)
user3556757

1
使用这种方法转换整数列表是不可靠的:如果您的集合是([1,2,12,6]),那么list(([1,2,12,6]))您将得到一个列表,例如 [1,2,1,2,6]
PradyJord 2014年

12

代替:

first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

为什么不简化该过程:

my_list = list(set([1,2,3,4])

这将从您的列表中删除重复对象,并将列表返回给您。


5
两者之间没有区别。您只是内联了变量分配。

7

[编辑]似乎您之前已经重新定义了“列表”,将其用作变量名,如下所示:

list = set([1,2,3,4]) # oops
#...
first_list = [1,2,3,4]
my_set=set(first_list)
my_list = list(my_set)

你会得到

Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'set' object is not callable

5

每当遇到此类问题时,请尝试使用以下方法查找要首先转换的元素的数据类型:

type(my_set)

然后,使用:

  list(my_set) 

将其转换为列表。您现在可以像使用python中的任何普通列表一样使用新建列表。


3

只需键入:

list(my_set)

这会将格式为{'1','2'}的集合转换为格式为['1','2']的列表。


2

查看您的第一行。您的堆栈跟踪信息显然不是来自您在此处粘贴的代码,因此我不知道您到底做了什么。

>>> my_set=([1,2,3,4])
>>> my_set
[1, 2, 3, 4]
>>> type(my_set)
<type 'list'>
>>> list(my_set)
[1, 2, 3, 4]
>>> type(_)
<type 'list'>

你想要的是set([1, 2, 3, 4])

>>> my_set = set([1, 2, 3, 4])
>>> my_set
set([1, 2, 3, 4])
>>> type(my_set)
<type 'set'>
>>> list(my_set)
[1, 2, 3, 4]
>>> type(_)
<type 'list'>

“不可调用”异常表示您正在执行类似操作set()()-尝试调用set实例。


0

我不确定您是否正在使用此([1, 2])语法创建一个集合,而不是一个列表。要创建集合,您应该使用set([1, 2])

这些括号只是包裹住您的表达方式,就像您会写的那样:

if (condition1
    and condition2 == 3):
    print something

并没有真正被忽略,但是对您的表情什么也不做。

注意:(something, something_else)将创建一个元组(但仍然没有列表)。


@gath您的编辑对我来说似乎不错,至少是第一个块。您还有错误吗?您可以在新的命令行中尝试吗?只需输入即可得到什么set
乔尔

0

Python是一种动态类型化的语言,这意味着您不能像在C或C ++中那样定义变量的类型:

type variable = value

要么

type variable(value)

在Python中,如果更改类型或类型的初始化函数(构造函数)来声明类型的变量,则可以使用强制转换:

my_set = set([1,2,3])
type my_set

会给你<type 'set'>答案。

如果有列表,请执行以下操作:

my_list = [1,2,3]
my_set = set(my_list)

-1

嗯,我敢打赌,在前面的几行中,您会看到以下内容:

list = set(something)

我错了吗 ?


正如上面在一个答案中提到的,您也有相同的假设。在主要问题代码中,可能将其设置list为等于创建set set(values)。而且这很混乱。您的答案不应被否决。但这也并没有吸引读者:)我们只是在浏览,看到错误的事情被否决了。
Vladimir Vukanac
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.