Użyj nawiasów klamrowych, aby zainicjować zestaw w Pythonie

104

Uczę się Pythona i mam początkowe pytanie dotyczące inicjalizacji zestawów. Podczas testów odkryłem, że zestaw można zainicjować w następujący sposób:

my_set = {'foo', 'bar', 'baz'}

Czy są jakieś wady zrobienia tego w ten sposób, w przeciwieństwie do standardowego sposobu:

my_set = set(['foo', 'bar', 'baz'])

czy to tylko kwestia stylu?

fvrghl
źródło
2
Dokumentacja o tym wspomina, ale nie ma. Zauważ, że to jest dokumentacja przestarzałego modułu, prawdziwe zestawy są teraz wbudowane. Znajduje się w dokumencie „Co nowego w Pythonie 2.7”, a odniesienie do języka krótko to opisuje: docs.python.org/2/reference/expressions.html#set-displays
@delnan Używam pythona 2.7, więc nie pomyślałem, żeby zaglądać do dokumentacji Pythona 3. Link, który zamieściłem, dotyczy wersji 2.7, ale o dziwo nie wspomina o tym.
fvrghl
1
Odkąd zredagowałem mój komentarz, dokument 2.7 również o tym wspomina. Opublikowane przez Ciebie łącze jest nieaktualne, relikt przeszłości, błędne, przestarzałe. Zapomnij, że istnieje i użyj zamiast tego tego, co sam poleci : docs.python.org/2/library/stdtypes.html#set and docs.python.org/2/library/stdtypes.html#frozenset
@delnan Dzięki za pomoc. Zredagowałem pytanie tak, że nie mówię już, że nie ma do niego dokumentacji (chociaż jest kilka przykładów wspominających o tym w Internecie).
fvrghl
Dla przechodnia: Pycharm ostrzega przed używaniem wywołania funkcji, gdy można użyć dosłownego - mogą być przyczyny wydajnościowe - więc wolę ustawić dosłowny sposób w nowym kodzie
Mr_and_Mrs_D

Odpowiedzi:

106

Istnieją dwa oczywiste problemy ze składnią zestawu literału:

my_set = {'foo', 'bar', 'baz'}
  1. Nie jest dostępny przed wersją Python 2.7

  2. Nie ma możliwości wyrażenia pustego zestawu przy użyciu tej składni (użycie {}tworzy pusty dict)

Te mogą być dla Ciebie ważne, ale nie muszą.

Sekcja dokumentacji opisująca tę składnię jest tutaj .

bgporter
źródło
49

Porównaj także różnicę między {}iz set()argumentem pojedynczego słowa.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

ale oba ai bsą oczywiście zestawami.

Thruston
źródło
4
dlatego lubię przypominać sobie konstruktora zestawu set([])raczej niż tylko set().
Michael Ekoka
3
set()zawsze przyjmuj jeden argument. Pojedyncza iterowalna.
George Kettleborough
1
@GeorgeKettleborough pojedynczy argument lub brak argumentów, ten ostatni tworzy pusty zestaw.
gertvdijk
28

Z dokumentacji Pythona 3 ( to samo dotyczy Pythona 2.7 ):

Do tworzenia zestawów można użyć nawiasów klamrowych lub funkcji set (). Uwaga: aby stworzyć pusty zestaw, musisz użyć set (), a nie {}; ta ostatnia tworzy pusty słownik, strukturę danych, którą omówimy w następnej sekcji.

w pythonie 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Pamiętaj, że {}jest również używany do map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

Do inicjalizacji zbiorów można również użyć wszechstronnej składni:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])
0x90
źródło
1

Musisz zrobić, empty_set = set()aby zainicjować pusty zestaw. {}jest pustym dictionaty.

Arjjun
źródło