Verwenden Sie geschweifte Klammern, um ein Set in Python zu initialisieren

97

Ich lerne Python und habe eine Anfängerfrage zum Initialisieren von Sets. Durch Tests habe ich festgestellt, dass ein Set folgendermaßen initialisiert werden kann:

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

Gibt es irgendwelche Nachteile, wenn man es auf diese Weise macht, im Gegensatz zu der Standardmethode von:

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

oder ist es nur eine Frage des Stils?

fvrghl
quelle
2
Die Dokumentation erwähnt es, nur nicht dort. Beachten Sie, dass dies die Dokumentation für ein veraltetes Modul ist. Die realen Sets sind jetzt integriert. Es befindet sich im Dokument "Was ist neu in Python 2.7?" Und wird in der Sprachreferenz kurz beschrieben: docs.python.org/2/reference/expressions.html#set-displays
@delnan Ich verwende Python 2.7, daher habe ich nicht daran gedacht, in den Python 3-Dokumenten nachzuschauen. Der Link, den ich gepostet habe, ist für 2.7, aber das wird seltsamerweise nicht erwähnt.
fvrghl
1
Ich habe seitdem meinen Kommentar bearbeitet, die 2.7 Dokumente erwähnen dies auch. Der Link, den Sie gepostet haben, ist veraltet, ein Relikt der Vergangenheit, falsch, veraltet. Vergessen Sie, dass es existiert, und verwenden Sie stattdessen das, was es Ihnen sagt: docs.python.org/2/library/stdtypes.html#set und docs.python.org/2/library/stdtypes.html#frozenset
@delnan Danke, dass du mir geholfen hast. Ich habe die Frage so bearbeitet, dass ich nicht mehr sage, dass es keine Dokumentation dafür gibt (obwohl es nur wenige Beispiele gibt, die dies online erwähnen).
fvrghl
Für Passanten von: Pycharm warnt vor der Verwendung eines Funktionsaufrufs, wenn ein Literal verwendet werden kann - es kann Leistungsgründe geben - bevorzugen Sie daher die in neuem Code festgelegte
Literalmethode

Antworten:

100

Es gibt zwei offensichtliche Probleme mit der Set-Literal-Syntax:

my_set = {'foo', 'bar', 'baz'}
  1. Es ist nicht vor Python 2.7 verfügbar

  2. Es gibt keine Möglichkeit, eine leere Menge mit dieser Syntax auszudrücken (mit {}erstellt ein leeres Diktat)

Diese können für Sie wichtig sein oder auch nicht.

Der Abschnitt der Dokumente, in dem diese Syntax beschrieben wird, befindet sich hier .

bgporter
quelle
45

Vergleichen Sie auch den Unterschied zwischen {}und set()mit einem einzelnen Wortargument.

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

aber beides aund bsind natürlich sätze.

Thruston
quelle
4
Deshalb erinnere ich mich set([])lieber an den Mengenkonstruktor als nur daran set().
Michael Ekoka
3
set()Nimm immer ein einziges Argument. Eine einzige iterable.
George Kettleborough
1
@ GeorgeKettleborough ein einzelnes oder keine Argumente, letztere, um eine leere Menge zu erstellen.
Gertvdijk
28

Aus der Python 3-Dokumentation ( dasselbe gilt für Python 2.7 ):

Mit geschweiften Klammern oder der Funktion set () können Sätze erstellt werden. Hinweis: Um eine leere Menge zu erstellen, müssen Sie set () verwenden, nicht {}; Letzteres erstellt ein leeres Wörterbuch, eine Datenstruktur, die wir im nächsten Abschnitt behandeln.

in Python 2.7:

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

Beachten Sie, dass dies {}auch für map/ verwendet wird dict:

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

Man kann auch eine umfassende Syntax verwenden, um Mengen zu initialisieren:

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

Sie müssen empty_set = set()einen leeren Satz initialisieren. {}Ich bin leer dictionaty.

Arjjun
quelle