Maps/Dictionaries in Python

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.
Antworten
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Hallo,

ich möchte ein Dictionary mit n-(k,v) Paaren erzeugen..

Kann mir dabei jemand helfen?

Danke im voraus =)
BlackJack

@Vega: Und wo ist das konkrete Problem? Ohne zu wissen wie Schlüssel und Werte zustande kommen sollen, kann man da nicht wirklich etwas zu sagen.
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Ich habe eine variable n
und jetzt möchte ich ein dict erstellen mit n (k,v) paaren.
Die Werte der Schlüssel und Werte sind erstmal egal also können z.B. 0 sein oder so.
Aber ich weiß nicht, wie ich die dict größe in abhänigkeit von n mache.
BlackJack

@Vega: Wenn man etwas Wiederholen möchte verwendet man Schleifen. Ein Wörterbuch mit `n` Einträgen erstellen ist das selbe wie `n`-mal einen neuen Eintrag hinzuzufügen.

Etwas kompakter kann man das schreiben wenn man sich klar macht das `dict()` ein Wörterbuch aus einem iterierbaren Objekt aus Schlüssel/Wert-Paaren erstellt und man einen Generatorausdruck schreiben kann. Wenn es okay ist, dass alle Werte identisch sind, kann man auch `dict.fromkeys()` verwenden, was wahrscheinlich die minimale Variante wäre wenn man auch noch den Defaultwert `None` nimmt:

Code: Alles auswählen

In [8]: dict.fromkeys(xrange(10))
Out[8]: 
{0: None,
 1: None,
 2: None,
 3: None,
 4: None,
 5: None,
 6: None,
 7: None,
 8: None,
 9: None}
Vielleicht willst Du aber auch gar nicht vorbelegen/Dummywerte speichern sondern etwas aus `collections` wie `defaultdict()` oder `Counter` verwenden. Dazu müsste man aber wissen was Du *eigentlich* machen willst. Also das Problem und nicht eine vermeintliche Lösung kennen.
Sirius3
User
Beiträge: 17777
Registriert: Sonntag 21. Oktober 2012, 17:20

@Vega: Du weißt nicht, wie man die Größe eines Wörterbuchs festlegt, weil das auch keinen Sinn ergibt. Man hat eine Menge an Schlüsseln und Werten und speichert die in einem Wörterbuch. Sobald Du also weißt, bzw. verrätst, wie Du die n Schlüssel zu erzeugen gedenkst, ist die Lösung trivial.
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Ja, stimmt.

Wie kann ich eine Liste erstellen mit n-Elementen z.B. mit n leeren listen in einer Liste.
Ich habe versucht: [[]*n] aber wenn ich dann in die erste leere Liste etwas einfüge, fügt er es bei allen ein..
Gibt es da eine Möglichkeit?

Danke im voraus =)
Sirius3
User
Beiträge: 17777
Registriert: Sonntag 21. Oktober 2012, 17:20

@Vega: Du erzeugst n leere Listen in dem Du n leere Listen erzeugst. Wie Du eine erzeugst, hast Du schon gezeigt und dass, wenn man etwas wiederholen will, eine Schleife nimmt, weißt Du auch schon.
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

stellt sich zuerst die Frage: warum? Listen sind in Python "mutable", d.h. veränderlich. Du kannst _jederzeit_ Elemente hinzufügen und raus löschen.

Falls trotzdem der extrem unwahrscheinliche Fall eintreten würde, dass ich eine leere Liste von Listen bräuchte, dann würde ich das per list comprehension machen.

Gruß, noisefloor
BlackJack

@Vega: Erkläre doch mal bitte was das Problem ist welches Du *eigentlich* lösen möchtest, und nicht was Du bereits als eine (Teil)Lösung dafür hältst. Denn es ist in der Regel in Python nicht üblich oder nötig Wörterbücher oder Listen im voraus mit einer bestimmten Grösse oder Anzahl von ”Dummy”-Elementen zu erstellen. Das versuchen aber sehr häufig Leute die von anderen Sprachen kommen und irgendwie im Kopf haben man müsste (genügend) Speicher reservieren, bevor man anfängt mit einer Datenstruktur zu arbeiten. In Python macht man das nicht, sondern baut die Datenstrukturen dynamisch auf. Es ist sehr selten das man das braucht oder macht, was Du da gerade vorhast.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Vega: Falls Du Dich wunderst, warum Du nach dem Zweck einer Lösung gefragt wirst, statt dass Du die (vermeintliche) Lösung direkt gezeigt bekommst: sei p eine Liste mit q leeren Listen:

Code: Alles auswählen

p = [list() for _ in range(q)]
dann lassen sich die vordefinierten Listen per Index ansprechen. Oftmals sind statt Indices aber 'sprechende' keys in Python die bessere Wahl, so dass sich in diesem Fall ein 'defaultdict(list)' empfehlen würde.

Oder vielleicht auch ganz etwas anderes, je nachdem, was Du vorhast.
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

Danke, kann ich das auch so machen, dass die Listen untereinander sind?
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

äh... wie Python die Listen im Speicher hält und wie _du_ die dann auf dem Bildschirm ausgibst hat so rein gar nichts miteinander zu tun. Grundsätzlich kannst du die Ausgabe auch so formatieren, dass pro Zeile Liste ausgegeben wird.

Gruß, noisefloor
Vega
User
Beiträge: 28
Registriert: Sonntag 29. Januar 2017, 12:03

ich füge später in die leere Listen wieder Listen ein, da dies ziemlich verwirrend aussieht, möchte ich die Listen die am Anfang erstellt wurden bei der Ausgabe untereinander und nicht aneinander reihen.
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

dann musst _du_ dich halt bei der Ausgabe darum kümmern, dass das ordentlich aussieht. Was du halt mit einem simplen `print(liste_der_liste_der_listen)` nicht hinbekommst. Du kannst z.B. über die Liste iterieren und die Liste dann zeilenweise ausgeben. Oder du nimmst eines der (vielen) Python-Module, die verschachtelte Listen "schön" ausgeben. Oder du nimmst statt einer Liste einen NumPy-Array, da erfolgt die Ausgabe i.d.R. zeilenweise. Oder du erstellst dir eine eigene Klasse, die von von `list` erbt und überschreibst du `__str__` Methode so, dass sie deinen Vorstellungen entspricht ;-)

Gruß, noisefloor
Antworten