Variable etwas anders ausgeben

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.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Graf2.0: Da `dict`s keine Reihenfolge haben, kann man keinen sinnvollen Index zu einem Wert definieren. Außerdem: Was sollte deiner Meinung nach dabei rauskommen:

Code: Alles auswählen

d = {"foo": "bar", "baz": "bar"}
print(d.index("bar"))
Als Lektüre würde ich noch das Tutorial empfehlen. Da sind die Grunddatentypen alle beschrieben.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Stimmt, hast recht. So würde das keinen Sinn machen, allerdings sollte der index von einem Schlüssel doch möglich sein. Bezogen auf dein Beispiel müsste print(d.index("baz")) doch Funktionieren und mir 2 liefern, denn ein Schlüssel darf doch nicht doppelt vorkommen, außer man möchte den Wert überschreiben.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Probiere es doch mal aus und schaue was passiert:

Code: Alles auswählen


>>> d = {"t" : "a", "b" : "a", "t" : "c"}
>>> d.index("t")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'index'
>>> print d["t"]
c
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Graf2.0: `dict`s haben aber keine Ordnung. In anderen Worten:

Code: Alles auswählen

print({"foo": "bar", "baz": "bar"} == {"baz": "bar", "foo": "bar"})
wird `True` ausgeben, weil die Reihenfolge der Schlüssel-Wert-Paare im `dict` keine Bedeutung hat. Man kann also nicht sagen, dass `"baz"` später im `dict` vorkommt als `"foo"` und deswegen einen höheren Index haben muss.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Ok vielen dank nochmal das ihr mir helft da wäre nämlich noch was, und zwar frage ich mich wie ich dem Skript sagen kann das in einer for-schleife gerade das letzte Element ausgewählt wurde. Ein Beispiel:

a = [1, 2, 3, 4]
b = [3, 4, 5, 6, 7, 8, 9]

for x, y in zip(a,b):
print x # b ist länger als a daher möchte das a so oft wiederholt wird wie b inhalt hat sprich das len(a)=len(b) ist
print y

Mein erster Gedanke war es x zu sagen das x gerade das letzte Element von a bekommen hat und es wieder von vorn beginnen zu lassen. Da der inhalt der Listen a und b sich ständig ändert kann ich mich auch nicht darauf verlassen.
Natürlich bin ich auch für andere Vorschläge offen.
Ich möchte Grunde dass a so aussieht:

a = [1, 2, 3, 4, 1, 2, 3]
b = [3, 4, 5, 6, 7, 8, 9]
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Graf2.0: Sowas geht mit zip() und itertools.cycle().
In specifications, Murphy's Law supersedes Ohm's.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Danke für die schnelle Antwort. Ich habe Python 2.7 und der erkennt weder itertools.cycle() noch cycle. Muss ich dafür etwas importieren oder woran liegt das?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Und das kann man schneller ausprobieren oder googeln , als hier ein Posting erstellen :roll:
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Natürlich habe ich das gemacht und from itertools import * gefunden. Nur funktioniert das nicht und nahm an das es was anderes sein muss also was liegt näher als denjenigen zu fragen der mir dies empfiehlt.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Ok ist schon gut hab herausgefunden das cycle( ) für python 3 gedacht ist. Gibt es denn eine Funktion für python 2 die das selbe macht wie cycle()? Und ja das habe ich auch schon gegoogelt, aber nichts brauchbares gefunden.
Zuletzt geändert von Graf2.0 am Freitag 19. Januar 2018, 12:23, insgesamt 1-mal geändert.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


Itertools bietet für Python 2.7+ aber cycle an.
https://docs.python.org/2.7/library/ite ... ools.cycle

Code: Alles auswählen

from itertools import cycle, izip

for x,y in izip(cycle("1234"),cycle("3456789")):
    print x,y
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Vielen dank sebastian0202 du hast mich gerettet das war das letzte was ich noch brauchte um vegenere fertig zu stellen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Auch vor Python 2.7 gab es die cycle()-Funktion schon im itertools-Modul. Ich frage mich wie Graf2.0 zu seinen seltsamen Erkenntnissen kommt...

Vielleicht als Hinweis: Es existieren zwei aktuelle Python-Zweige (2 und 3) und dementsprechend gibt es auch Dokumentation für beide Zweige. Das ist etwas verwirrend für Anfänger aber bei Software auch nicht völlig ungewöhnlich.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@snafu: meine Vermutung ist, dass er sowas versucht hat:

Code: Alles auswählen

from itertools import *
xs = ...
ys = ...
for x, y in zip(itertools.cycle(xs), ys):
    ...
Uncle Iroh: "No! You're impatient. You have yet to master your basics."
In specifications, Murphy's Law supersedes Ohm's.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

@pillmuncher ja hast recht. Dummer Anfängerfehler :D
Antworten