Come convertire un set in un elenco in Python?


144

Sto cercando di convertire un set in un elenco in Python 2.6. Sto usando questa sintassi:

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

Tuttavia, ottengo la seguente traccia dello stack:

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

Come posso risolvere questo problema?


2
Funziona per me su Python 2.6.6 su Linux ... ma quella prima riga non crea un set.
detenere il

2
Secondo TypeError: 'set' object is not callable: che cos'è set? Grazie
mangia il

13
Hai oscurato il set incorporato. Forse hai digitato accidentalmente set=set(first_list)o qualcosa del genere. Ora setviene ridefinito per questo oggetto set che causerebbe quell'errore. Riprova con un nuovo interprete Python
John La Rooy,

3
@gnibbler: dovresti metterlo come una risposta, dato che è chiaramente quello che l'ha rotto.
Chris Morgan,

2
Peccato che la domanda sia stata modificata per correggere il problema. È confuso vedere il codice corretto seguito da un errore che non genererà. In effetti, la domanda originale prima delle modifiche non causa neanche l'errore mostrato. Sospetto che si tratti di un errore di copia e incolla.
LS

Risposte:


195

È già un elenco

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

Vuoi qualcosa di simile

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

EDIT: output del tuo ultimo commento

>>> 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]

Mi chiedo se hai fatto qualcosa del genere:

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

4
Quando scrivo (my_set) ricevo <type 'set'>
gath,

2
@gath, era prima che tu modificassi il codice. Il tuo codice attuale funziona bene sulla mia macchina. Puoi provare a copiarlo incollandolo in un interprete python così com'è e incollare l'output qui
utente

1
prova questo: >>> my_list = [1,2,3,4] >>> my_set = set (my_list) >>> my_new_list = list (my_set) Traceback (ultima chiamata più recente): File "<console>", riga 1, in <module> TypeError: l'oggetto 'set' non è richiamabile
gath

1
Scommetto che ha accidentalmente associato il nome 'set' a {1,2,3} o [1,2,3] o qualcosa del genere. (Perché l'ho fatto accidentalmente durante gli esperimenti)
user3556757

1
La conversione di un elenco di numeri interi con questo metodo non è affidabile: se il tuo set è ([1,2,12,6])e lo fai list(([1,2,12,6]))otterrai un elenco simile [1,2,1,2,6]
PradyJord,

12

Invece di:

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

Perché non abbreviare il processo:

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

Ciò rimuoverà i duplicati dal tuo elenco e ti restituirà un elenco.


5
Non c'è differenza tra entrambi. Hai appena sottolineato le assegnazioni delle variabili.

7

[EDITED] Sembra che tu abbia precedentemente ridefinito "list", utilizzandolo come nome di una variabile, in questo modo:

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

E otterrai

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

5

Ogni volta che sei bloccato in questo tipo di problemi, prova a trovare il tipo di dati dell'elemento che vuoi convertire prima usando:

type(my_set)

Quindi, utilizzare:

  list(my_set) 

per convertirlo in un elenco. Ora puoi usare la lista appena costruita come una normale lista in Python.


3

Digita semplicemente:

list(my_set)

Ciò trasformerà un set nel formato {'1', '2'} in un elenco nel modulo ['1', '2'].


2

Rivedi la tua prima riga. La traccia dello stack non è chiaramente dal codice che hai incollato qui, quindi non so esattamente cosa hai fatto.

>>> 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'>

Quello che volevi era 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'>

L'eccezione "non richiamabile" significa che stavi facendo qualcosa di simile set()(): tentare di chiamare setun'istanza.


0

Non sono sicuro che stai creando un set con questa ([1, 2])sintassi, piuttosto un elenco. Per creare un set, è necessario utilizzare set([1, 2]).

Queste parentesi stanno semplicemente migliorando la tua espressione, come se avessi scritto:

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

Non ci sono davvero ignorati, ma non fare nulla per la tua espressione.

Nota: (something, something_else)creerà una tupla (ma ancora nessuna lista).


@gath mi sembra che la tua modifica vada bene, almeno il primo blocco. Hai ancora l'errore? Puoi provarlo in una nuova riga di comando? Cosa ottieni quando scrivi solo set?
Joël,

0

Python è un linguaggio tipizzato in modo dinamico, il che significa che non è possibile definire il tipo di variabile come in C o C ++:

type variable = value

o

type variable(value)

In Python, usi il coercing se cambi tipi o le funzioni init (costruttori) dei tipi per dichiarare una variabile di un tipo:

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

ti darà <type 'set'>una risposta.

Se hai un elenco, fai come segue:

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

-1

Scommetto che in alcune righe precedenti hai qualcosa del tipo:

list = set(something)

Ho sbagliato ?


Come menzionato sopra in una risposta, hai anche lo stesso presupposto. Nel codice principale della domanda è stato probabilmente impostato listper essere uguale alla creazione di set set(values). E stava facendo confusione. La tua risposta non deve essere sottoposta a downgrade. Ma anche non sta agganciando i lettori :) Stiamo solo scremando e vedendo cose sbagliate ridimensionare.
Vladimir Vukanac,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.