Comment convertir un ensemble en liste en python?


144

J'essaye de convertir un ensemble en une liste dans Python 2.6. J'utilise cette syntaxe:

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

Cependant, j'obtiens la trace de pile suivante:

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

Comment puis-je réparer cela?


2
Fonctionne pour moi sur Python 2.6.6 sous Linux ... mais cette première ligne ne crée pas d'ensemble.
detly le

2
Selon TypeError: 'set' object is not callable: Qu'est-ce que c'est set? Merci
manger le

13
Vous avez masqué l'ensemble intégré. Peut-être avez-vous tapé accidentellement set=set(first_list)ou quelque chose comme ça. Maintenant setest redéfini à cet objet d'ensemble qui provoquerait cette erreur. Essayez à nouveau avec un nouvel interprète Python
John La Rooy

3
@gnibbler: vous devriez mettre cela comme une réponse, car c'est clairement ce qui l'a cassé.
Chris Morgan

2
C'est dommage que la question ait été modifiée pour corriger le problème. Il est déroutant de voir le code correct suivi d'une erreur qu'il ne générera pas. En fait, la question d'origine avant les modifications ne provoque pas non plus l'erreur affichée. Je soupçonne que c'est une erreur de copier-coller.
LS le

Réponses:


195

C'est déjà une liste

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

Voulez-vous quelque chose comme

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

EDIT: Sortie de votre dernier commentaire

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

Je me demande si vous avez fait quelque chose comme ça:

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

4
Quand je tape (my_set) j'obtiens <type 'set'>
gath

2
@gath, c'était avant de modifier le code. Votre code actuel fonctionne correctement sur ma machine. Pouvez-vous essayer de copier-coller cela dans un interpréteur python tel quel et de coller la sortie ici
utilisateur

1
essayez ceci: >>> ma_liste = [1,2,3,4] >>> mon_set = set (ma_liste) >>> my_new_list = list (mon_set) Traceback (dernier appel en dernier): Fichier "<console>", ligne 1, dans <module> TypeError: l'objet 'set' n'est pas appelable
gath

1
Je parie qu'il a accidentellement lié le nom «set» à {1,2,3} ou [1,2,3] ou quelque chose comme ça. (Parce que je l'ai fait accidentellement lors de l'expérimentation)
user3556757

1
La conversion d'une liste d'entiers en utilisant cette méthode n'est pas fiable: si votre ensemble l'est ([1,2,12,6])et vous le faites, list(([1,2,12,6]))vous obtiendrez une liste du type [1,2,1,2,6]
PradyJord

12

Au lieu de:

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

Pourquoi ne pas raccourcir le processus:

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

Cela supprimera les dupes de votre liste et vous renverra une liste.


5
Il n'y a aucune différence entre les deux. Vous venez d'insérer les affectations de variables.

7

[EDITED] Il semble que vous ayez redéfini "liste" plus tôt, en l'utilisant comme nom de variable, comme ceci:

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

Et vous obtiendrez

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

5

Chaque fois que vous êtes coincé dans ce type de problèmes, essayez de trouver le type de données de l'élément que vous souhaitez convertir en premier en utilisant:

type(my_set)

Ensuite, utilisez:

  list(my_set) 

pour le convertir en liste. Vous pouvez maintenant utiliser la liste nouvellement construite comme n'importe quelle liste normale en python.


3

Tapez simplement:

list(my_set)

Cela transformera un ensemble sous la forme {'1', '2'} en une liste sous la forme ['1', '2'].


2

Passez en revue votre première ligne. Votre trace de pile ne provient clairement pas du code que vous avez collé ici, donc je ne sais pas précisément ce que vous avez fait.

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

Ce que tu voulais, c'était 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'exception "non appelable" signifie que vous faisiez quelque chose comme set()()- une tentative d'appeler une setinstance.


0

Je ne suis pas sûr que vous créez un ensemble avec cette ([1, 2])syntaxe, plutôt une liste. Pour créer un ensemble, vous devez utiliser set([1, 2]).

Ces crochets enveloppent simplement votre expression, comme si vous auriez écrit:

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

Il n'y a pas vraiment ignoré, mais ne faites rien à votre expression.

Remarque: (something, something_else)créera un tuple (mais toujours pas de liste).


@gath, votre modification me semble correcte, du moins le premier bloc. Avez-vous toujours l'erreur? Pouvez-vous essayer ceci dans une nouvelle ligne de commande? Qu'obtenez-vous en tapant simplement set?
Joël

0

Python est un langage typé dynamiquement, ce qui signifie que vous ne pouvez pas définir le type de la variable comme vous le faites en C ou C ++:

type variable = value

ou

type variable(value)

En Python, vous utilisez la contrainte si vous changez de types, ou les fonctions init (constructeurs) des types pour déclarer une variable d'un type:

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

te donnera <type 'set'> une réponse.

Si vous avez une liste, procédez comme suit:

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

-1

Hmmm je parie que dans certaines lignes précédentes, vous avez quelque chose comme:

list = set(something)

Ai-je tort ?


Comme mentionné ci-dessus dans une des réponses, vous avez également la même hypothèse. Dans le code principal de la question était probablement défini listpour être égal à créer un ensemble set(values). Et cela créait de la confusion. Votre réponse ne doit pas être rejetée. Mais ce n'est pas non plus accrocher les lecteurs :) Nous sommes juste en train d'écrémer et de voir une mauvaise chose contre le vote.
Vladimir Vukanac
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.