Python mis à la liste

159

Comment puis-je convertir un ensemble en liste en Python? En utilisant

a = set(["Blah", "Hello"])
a = list(a)

ne fonctionne pas. Ça me donne:

TypeError: 'set' object is not callable

la source
6
Ce qui précède fonctionne pour moi sur Python 2.7.
aukaost le
20
si vous avez nommé une autre variable dans votre code, setmodifiez-la car vous observez la fonction intégrée set.
mouad le
5
@mouad Non, la chaîne entre parenthèses dans a TypeErrorest le nom du type , pas le nom de la variable
phihag
7
@Judge John Deed: Vous l'avez fait list = some_setquelque part. Ajoutez print listavant de l'appeler.
Jochen Ritzel le
6
J'ai rencontré ce problème lors du débogage dans PDB où «list» est remplacé en tant que commande PDB.
WP McNeill

Réponses:

242

Votre code ne travail (testé avec CPython 2.4, 2.5, 2.6, 2.7, 3.1 et 3.2):

>>> a = set(["Blah", "Hello"])
>>> a = list(a) # You probably wrote a = list(a()) here or list = set() above
>>> a
['Blah', 'Hello']

Vérifiez que vous n'avez pas écrasé listpar accident:

>>> assert list == __builtins__.list
Phihag
la source
2
Je viens de copier et coller ce code exact dans IDLE; J'obtiens l'erreur.
Pouvez-vous fournir la sortie de dir(set)et print set?
Susam Pal
['and', 'class', 'cmp', 'contains', 'delattr', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'iand', 'init', 'ior', 'isub', 'iter', 'ixor', 'le', 'len', 'lt', 'ne', 'new', 'or', 'rand', 'reduce', 'reduce_ex', 'repr', 'ror', 'rsub', 'rxor', 'setattr', 'sizeof', 'str', 'sub', 'subclasshook', 'xor', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'](supprimé __ en raison de la limite de caractères)
@Judge John Deed À quelle ligne obtenez-vous l'erreur? Vous avez l' setair bien.
phihag
essayez Set au lieu de set: REF: docs.python.org/2/library/sets.html
Gonzalo
72

Vous avez masqué l'ensemble intégré en l'utilisant accidentellement comme nom de variable, voici un moyen simple de reproduire votre erreur

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

La première ligne renvoie l'ensemble vers une instance de l'ensemble. La deuxième ligne tente d' appeler l'instance qui échoue bien sûr.

Voici une version moins déroutante utilisant des noms différents pour chaque variable. Utiliser un nouvel interprète

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

Espérons qu'il est évident que l'appel aest une erreur

John La Rooy
la source
25

avant d'écrire, set(XXXXX) vous avez utilisé "set" comme variable, par exemple

set = 90 #you have used "set" as an object


a = set(["Blah", "Hello"])
a = list(a)
Zhang Yiwei
la source
15

Cela fonctionnera:

>>> t = [1,1,2,2,3,3,4,5]
>>> print list(set(t))
[1,2,3,4,5]

Cependant, si vous avez utilisé "list" ou "set" comme nom de variable, vous obtiendrez le:

TypeError: 'set' object is not callable

par exemple:

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

La même erreur se produira si vous avez utilisé "liste" comme nom de variable.

pseudo
la source
6
s = set([1,2,3])
print [ x for x in iter(s) ]
peerxu
la source
4

Votre code fonctionne avec Python 3.2.1 sur Win7 x64

a = set(["Blah", "Hello"])
a = list(a)
type(a)
<class 'list'>
Wendal Chen
la source
2

Essayez d'utiliser une combinaison de fonctions map et lambda:

aList = map( lambda x: x, set ([1, 2, 6, 9, 0]) )

C'est une approche très pratique si vous avez un ensemble de nombres en chaîne et que vous souhaitez le convertir en liste d'entiers:

aList = map( lambda x: int(x), set (['1', '2', '3', '7', '12']) )
J y vais, au revoir
la source