Frage zu dict()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
rolgal_reloaded
User
Beiträge: 309
Registriert: Dienstag 24. Oktober 2006, 19:31

Frage zu dict()

Beitragvon rolgal_reloaded » Samstag 2. Dezember 2006, 15:22

Hallo zusammen,

Code: Alles auswählen

>>> d=dict(1=eins)
SyntaxError: keyword can't be an expression
>>> d=dict(eins=1)
>>> d
{'eins': 1}
>>>


Wieso geht #1 nicht und #2 schon?

LG

rolgal_reloaded
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Samstag 2. Dezember 2006, 15:30

Code: Alles auswählen

>>> dict = {1:'fuenf'}
>>> dict
{1: 'fuenf'}
>>> dict2= dict(1=fuenf)
SyntaxError: keyword can't be an expression


Dürfte eigentlich auch einiges Sagen :)

Warum genau das nicht geht... keine Ahnung. Aber ich habs auch mal gehabt. Die Funktion '' dict() '' macht ja soweit ich das verstanden habe mehr als nur das ganze in ein Dictionary umzuwandeln... oder macht dies zumindest anders :)


Mfg EnTeQuAk
BlackJack

Beitragvon BlackJack » Samstag 2. Dezember 2006, 15:31

Weil 1 kein gültiger Bezeichner ist!?
rolgal_reloaded
User
Beiträge: 309
Registriert: Dienstag 24. Oktober 2006, 19:31

Beitragvon rolgal_reloaded » Samstag 2. Dezember 2006, 16:03

beim ersten Beispiel macht er aus eins - "eins".

Deshalb ist mir das nicht klar, egal was mir in dem Fall der SyntaxError sagt.

Übrigens: gibt es eine Möglichkeit mit dict(bla bla bla) ein Dictionary zu bekommen. Und zwar auch für die Möglichkeit die gescheitert ist?

rolgal_reloaded
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Samstag 2. Dezember 2006, 16:12

Du kannst in Python bei jedem Funktionsaufruf explizit den Namen des Parameters übergeben.
Wenn du z.B. eine Funktion foo(a, b) definiert hast, sind die Aufrufe foo("Hallo", 42), foo(a="Hallo", b=42) und foo(b=42, a="Hallo") vollkommen identisch.

Nun kannst du auch eine Funktion so definieren, dass sie beliebig viele benannte Parameter nimmt, und diese bekommt sie dann in einem Dictionary übergeben. Der Konstruktor von dict() nutzt dieses aus, damit du eine nette Syntax hast.

Dies geht aber nur, wenn die Schlüssel gültige Bezeichner sind, was 1 nicht ist. In diesem Falle musst du das Dictionary so initialiseren, wie es "eigentlich" eh geht; die Methode über keyword parameter ist nur Convenience.

Und wie das geht, hat Entequack schon geschrieben

Code: Alles auswählen

mein_tolles_dict = { 1:"eins",
"sieben": 7}
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 2. Dezember 2006, 16:13

BlackJack hat geschrieben:Weil 1 kein gültiger Bezeichner ist!?

Stimmt nicht bzw. nur fast:

Code: Alles auswählen

>>> foo = {1: "eins"}
>>> foo
{1: 'eins'}
>>> bar = dict(1 = eins)
>>> bar
SyntaxError: keyword can't be an expression

Es geht also doch bloß man muss das dicht nicht mit ``dict`` sondern mit ``{}`` erzeugen :)

EDIT: OK bin zu Spät , wurde ein post über mir schon gesagt.
BlackJack

Beitragvon BlackJack » Samstag 2. Dezember 2006, 16:18

rolgal_reloaded hat geschrieben:beim ersten Beispiel macht er aus eins - "eins".

Deshalb ist mir das nicht klar, egal was mir in dem Fall der SyntaxError sagt.


`dict()` ist eine ganz normale Funktion in Python und damit gelten auch dafür die normalen Regeln, und die besagen, dass Schlüsselwortargumente gültige Bezeichner sein müssen. Wäre dem nicht so, wäre folgendes "möglich":

Code: Alles auswählen

def spam(1=2, 2=None, 3='foo'):
    # keine Ahnung wie man hier jetzt auf die
    # Argumente Bezug nehmen sollte...

# und nun ein Aufruf
spam(2=7)


Das sieht doch wohl arg komisch aus, oder!?

Übrigens: gibt es eine Möglichkeit mit dict(bla bla bla) ein Dictionary zu bekommen. Und zwar auch für die Möglichkeit die gescheitert ist?


Du kannst ein Dictionary übergeben, oder ein "iterable" das Schlüssel/Wert-Paare liefert:

Code: Alles auswählen

In [4]: dict({42: 'answer'})
Out[4]: {42: 'answer'}

In [5]: dict([(42, 'answer')])
Out[5]: {42: 'answer'}
rolgal_reloaded
User
Beiträge: 309
Registriert: Dienstag 24. Oktober 2006, 19:31

Beitragvon rolgal_reloaded » Samstag 2. Dezember 2006, 16:30

@alle,

danke, hat mir schon weitergeholfen!

Dass mit den Funktionen und Bezeichnern war mir schon klar BlackJack, ich dachte nur bei dict() geht es vielleicht trotzdem, weil es ja statt d = {} benutzt werden kann.

Code: Alles auswählen

dict({42: 'answer'})


Das ist wohl was ich brauche, denke ich.

rolgal_reloaded
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 2. Dezember 2006, 17:03

Was ist den eigentlich der vorteil statt ``x = {}`` dann ``x = dict()`` zu schreiben? Ist das zweite Pythonischer? Ist ``dict()'`` nicht langsamer als ``{}``? Mir wahr so als ob ``dict()`` nicht bultine wahr.

lg
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Samstag 2. Dezember 2006, 17:11

XtraNine hat geschrieben:Was ist den eigentlich der vorteil statt ``x = {}`` dann ``x = dict()`` zu schreiben? Ist das zweite Pythonischer? Ist ``dict()'`` nicht langsamer als ``{}``? Mir wahr so als ob ``dict()`` nicht bultine wahr.


Aj, da könnte die Rechtschreibwoche wieder aufleben ;)

"dict" ist builtin, genauso wie z.B. "min" oder "isinstance".

"dict()" ist langsamer als "{}", weil der Name "dict" erst in den Globals aufgelöst werden muss, während aus "{}" direkt ein Opcode BUILD_MAP wird.

Letztendlich ist das eine Stilfrage.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 2. Dezember 2006, 17:39

birkenfeld hat geschrieben:Letztendlich ist das eine Stilfrage.

Über die wir hier schon mal gesprochen haben.

Hmm, ich gehe davon aus, dass für [] analoges gilt (d.h. dass dann ein Opcode verwendeet wird), oder?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Samstag 2. Dezember 2006, 17:58

Leonidas hat geschrieben:Hmm, ich gehe davon aus, dass für [] analoges gilt (d.h. dass dann ein Opcode verwendeet wird), oder?


Ja, BUILD_LIST.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Beitragvon BlackJack » Samstag 2. Dezember 2006, 18:22

Bevor jemand fragt: Ja für Tupel gibt's auch auch einen Opcode:

Code: Alles auswählen

In [11]: import dis

In [12]: def f():
   ....:     return ()
   ....:

In [13]: dis.dis(f)
  2           0 BUILD_TUPLE              0
              3 RETURN_VALUE


Und wie man sieht, auch einen einfachen Weg so etwas herauszufinden. Ich liebe Python. :-)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 2. Dezember 2006, 19:49

Cool :shock: einfach mit dis, hmm, gleich mal über alle möglichen Sachen jagen ^^ xD

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 2. Dezember 2006, 19:49

BlackJack hat geschrieben:Ich liebe Python. :-)
Tun wir alle :D

Wer ist online?

Mitglieder in diesem Forum: pixewakb