Python ustawiony na listę


159

Jak przekonwertować zestaw na listę w Pythonie? Za pomocą

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

nie działa. To daje mi:

TypeError: 'set' object is not callable
python  list  set 

6
Powyższe działa dla mnie na Pythonie 2.7.
aukaost

20
jeśli nazwałeś inną zmienną w swoim kodzie, setzmień ją, ponieważ śledzisz wbudowaną funkcję set.
mouad

5
@mouad Nie, ciąg w nawiasach w a TypeErrorto nazwa typu , a nie nazwa zmiennej
phihag

7
@Judge John Deed: list = some_setGdzieś to zrobiłeś . Dodaj, print listzanim zadzwonisz.
Jochen Ritzel

6
Trafiłem na ten problem podczas debugowania w PDB, gdzie „lista” jest zastępowana jako polecenie PDB.
WP McNeill

Odpowiedzi:


242

Kod czyni pracę (testowane CPython 2.4, 2.5, 2.6, 2.7, 3.1 i 3.2):

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

Sprawdź, czy przypadkowo nie nadpisałeś list:

>>> assert list == __builtins__.list

2
Właśnie skopiowałem i wkleiłem ten dokładny kod w IDLE; Otrzymuję błąd.

Czy możesz podać wynik dir(set)i 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'](usunięto __ z powodu limitu

@Judge John Deed W którym wierszu pojawia się błąd? Twój setwygląda dobrze.
phihag

spróbuj Ustaw zamiast set: REF: docs.python.org/2/library/sets.html
Gonzalo

72

Cieniowałeś wbudowany zestaw przez przypadkowe użycie go jako nazwy zmiennej, oto prosty sposób na powielenie błędu

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

Pierwsza linia ponownie wiąże zestaw do instancji set. Druga linia próbuje wywołać instancję, co oczywiście kończy się niepowodzeniem.

Oto mniej zagmatwana wersja, która używa różnych nazw dla każdej zmiennej. Korzystanie z nowego tłumacza

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

Miejmy nadzieję, że jest oczywiste, że dzwonienie ajest błędem


25

zanim napiszesz set(XXXXX) użyłeś "set" jako zmiennej np

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


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

15

To zadziała:

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

Jeśli jednak użyłeś „list” lub „set” jako nazwy zmiennej, otrzymasz:

TypeError: 'set' object is not callable

na przykład:

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

Ten sam błąd wystąpi, jeśli użyjesz „listy” jako nazwy zmiennej.



4

Twój kod działa z Pythonem 3.2.1 na Win7 x64

a = set(["Blah", "Hello"])
a = list(a)
type(a)
<class 'list'>

2

Spróbuj użyć kombinacji funkcji map i lambda:

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

Jest to bardzo wygodne podejście, jeśli masz zbiór liczb w łańcuchu i chcesz go przekonwertować na listę liczb całkowitych:

aList = map( lambda x: int(x), set (['1', '2', '3', '7', '12']) )
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.