Dictionary-Einträge in Zufallsreihenfolge

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben: ..., die mit der passenden Funktion aus `random` mischen, ...
(Nur um den Tipp noch stärker hervorzuheben :-) Dabei hilft - wie so oft - der englische Begriff weiter!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

BlackJack hat geschrieben:Man könnte auch gleich mit so einer Liste mit Paaren anfangen statt ein Wörterbuch zu verwenden, denn der Zugriff über den Schlüssel auf den Wert wird ja im Programm überhaupt nicht benötigt.
Nur um sicher zu gehen, damit ich mir jetzt nicht die Arbeit umsonst mache: Meintest du mit "Liste mit Paaren" zwei Listen, jeweils mit "Frage" und "Antworten" drinne, die mit zip() zusammengeführt werden ?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst auch eine Liste von Tupeln nehmen oder ein Tupel von Tupeln... ;-) Guck Dir mal Deine ``for``-Schleife an. Darauf bezog sich BlackJack. Du holst Dir da aktuell auch schon ein Paar von Schlüssel und Wert undkommst damit aus. Insofern muss die Struktur dahinter eben kein Dictionary sein.

Wieso sprichst Du jetzt ``zip`` an?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Weil ich nach Sachen wie zB "Liste mit Paaren" und Ähnlichem gesucht habe, dabei bin ich beispielsweise auf das Verknüpfen von zwei Listen mittels zip() gestoßen.
BlackJack

@lordzwieback: Warum zwei getrennte Listen und dann `zip()`? Das was `zip()` als Ergebnis hat, kann man doch auch gleich als Datenstruktur schreiben. Dann hat man die Daten auch immer zusammen und muss wenn man etwas ändern möchte nicht in zwei getrennten Listen im Quelltext mühsam abzählen welche beiden Einträge zusammengehören.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

BlackJack hat geschrieben:@lordzwieback: Warum zwei getrennte Listen und dann `zip()`? Das was `zip()` als Ergebnis hat, kann man doch auch gleich als Datenstruktur schreiben. Dann hat man die Daten auch immer zusammen und muss wenn man etwas ändern möchte nicht in zwei getrennten Listen im Quelltext mühsam abzählen welche beiden Einträge zusammengehören.
Meintest du in etwa so ? Das habe ich in Bezug auf Datenstrukturen/Sequenzen gefunden und umgesetzt. Ist auch praktischer, da ich einfach Einträge wie beispielsweise die englischen Begriffe hinzufügen kann. (Soweit ich das zumindest verstanden habe)

Code: Alles auswählen

osi_layer = [
    ["Schicht 1", "Bitübertragungsschicht"],
    ["Schicht 2", "Sicherungsschicht"],
    ["Schicht 3", "Vermittlungsschicht"],
    ["Schicht 4", "Transportschicht"],
    ["Schicht 5", "Sitzungsschicht"],
    ["Schicht 6", "Darstellungsschicht"],
    ["Schicht 7", "Anwendungsschicht"]
]
Später im Code versuche ich dann, über diese Datenstruktur zu laufen und mir die Datensätze ausgeben zu lassen, dabei bin ich auf ein Problem gestoßen:

Code: Alles auswählen

for entry in osi_layer:
    print(entry[0])
Das zeigt mir beispielsweise eine Liste an:
Schicht 1
Schicht 2
Schicht 3 ... usw

Aber wie bekomme ich die zugehörige Bezeichnung ausgegeben ? Folgendes habe ich schon getestet:

Code: Alles auswählen

for entry in osi_layer:
    print(entry[0][1])
Da bekomm ich dann nur den Buchstaben von beispielsweise "Schicht 1" angezeigt ("c"). Mit einem "," zwischen den eckigen Klammern funktioniert es auch nicht.

Mal so nebenbei: Vielen Dank für eure Geduld und Hilfe ;)

Werde trotzdem mal noch weitersuchen und mich hier melden, wenn ich die Lösung selbst gefunden habe.

Grüße
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@lordzwieback: schau Dir halt mal an, was entry für ein Objekt ist.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

@Sirius3 Ich will wirklich nicht 'unhöflich' sein, aber hättest du die Frage beantworten können nach einer Woche programmieren mit Python ? Weil ich ehrlich gesagt keine Ahnung habe, was 'entry' für ein Objekt ist und auch keine Ahnung habe, woran man das erkennt. Bitte entschuldige meine Unwissenheit.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schau Dir doch mal Deine Definition von ``osi_layer`` an. ``osi_layer`` selber ist eine Liste. Darin enthalten als Einträge sind wieder *Listen*.

Dann schau Dir die Schleife an:

Code: Alles auswählen

for entry in osi_layer:
Das kann man auch lesen als "für alle Einträge in der gegebenen Sammlung", wobei Sammlung hier eine Liste ist. Die Einträge Deiner Liste sind ja bekannt, s.o. Also wird ``entry`` in jedem Durchgang genau von diesem Typ sein :-)

Wenn Du einen Typen ermitteln willst, kannst Du die Funktion ``type`` nutzen. Also für das erste Element von ``osi_layer`` z.B.:

Code: Alles auswählen

type(osi_layer[0])
Und auf die Elemente einer Liste kann man mittels Indexzugriff zugreifen!

Wobei Du bei fixen Einträgen diese auch gleich im Schleifenkopf entpacken kannst:

Code: Alles auswählen

for level, name in osi_layer:
    print(level, name)
;-)

Du könntest Dir das Leben auch einfacher machen, indem Du die "Schicht x" Einträge eliminierst. Wie das geht, kannst Du hier lernen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

@Hyperion Danke für die Tipps. Werde mir das reinpfeifen und mich dann wieder melden.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@lordzwieback: anschauen, was für ein Objekt eine bestimmte Variable hat, sollte eines der ersten Dinge sein, die man lernt. In meinem Traumeinsteigerbuch für Python steht das in Kapitel 1.2: "Wie probiere ich Dinge in der interaktiven Pythonkonsole aus?"
In Deinem Fall fügst Du einfach an passender Stelle ein "print(type(entry))" bzw. "print(entry)" ein.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Die einzig richtige Art zu debuggen (in Python):

Code: Alles auswählen

def foo(x):
    ...
    print('???', type(x), ':::', x)
    y = bar(x)
    print('!!!', type(y), ':::', y)
    ...
In specifications, Murphy's Law supersedes Ohm's.
Antworten