Как преобразовать набор в список в Python?


144

Я пытаюсь преобразовать набор в список в 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
У меня работает на Python 2.6.6 в Linux ... но эта первая строка не создает набор.
детально

2
По словам TypeError: 'set' object is not callable: что это set? Спасибо
ешь

13
Вы скрыли встроенный набор. Возможно, вы случайно набрали set=set(first_list)или что-то. Теперь setпереопределяется для этого набора объектов, который будет вызывать эту ошибку. Попробуйте снова с новым интерпретатором Python
Джон Ла Рой

3
@gnibbler: вы должны поставить это в качестве ответа, поскольку именно это и сломало его.
Крис Морган

2
Это слишком плохо, вопрос был отредактирован, чтобы исправить проблему. Непонятно, что правильный код сопровождается ошибкой, которую он не сгенерирует. Фактически, исходный вопрос перед правками также не вызывает отображаемой ошибки. Я подозреваю, что это ошибка копирования и вставки.
LS

Ответы:


195

Это уже список

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) Traceback (последний вызов был последним): файл "<console>", строка 1, в <module> TypeError: объект '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

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

[EDITED] Кажется, вы ранее переопределили «список», используя его в качестве имени переменной, например:

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(values). И это создавало путаницу. Ваш ответ не должен быть опущен. Но также это не привлекает внимание читателей :) Мы просто смотрим и видим неправильные вещи.
Владимир Вуканац
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.