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

źródło
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
phihag
źródło
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

John La Rooy
źródło
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)
Zhang Yiwei
źródło
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.

Nacięcie
źródło
6
s = set([1,2,3])
print [ x for x in iter(s) ]
peerxu
źródło
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'>
Wendal Chen
źródło
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']) )
Idę, pa
źródło