Seite 2 von 2
Re: enumerate von Listen - doppelte Einträge
Verfasst: Samstag 24. März 2018, 14:40
von kbr
Wenn Du am Montag in Ruhe noch einmal anfängst, dann könntest Du statt der items deren Ids als keys verwenden:
So dürfen dann auch mutable Objekte in den Iterables enthalten sein.
Re: enumerate von Listen - doppelte Einträge
Verfasst: Samstag 24. März 2018, 14:57
von __deets__
@kbr: und dann sind zwei zahlen plötzlich nicht mehr gleich? Nicht so ne dolle Idee. Wenn es sich bei den Objekten *unter Umständen* mal um nicht-hashbare handeln sollte, kann man immer noch ein Argument “key” ala sorted oder Ähnliches vorsehen, welches Vergleichbarkeit sicherstellt. Dafür id zu nehmen ist nur für die allerwenigsten Fälle eine gute Idee.
Re: enumerate von Listen - doppelte Einträge
Verfasst: Samstag 24. März 2018, 15:48
von kbr
@__deets__: Dafür sind vier Augen besser als zwei: ich hatte in dem Moment nur Mutable im Sinn und verdrängt, dass dies ja ein Vergleich auf Identität ist. So bleibt es bei der Einschränkung, dass Mutable als Elemente eines Iterables in diesem Fall nicht vorkommen dürfen.
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 09:59
von nick21
Morgen zusammen. Mit einem eigenen Ansatz kommt man da doch weiter.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: ascii -*-
list_1 = ["a","b","a","c","b","a","x"]
n=len(list_1)
i=0
print len(list_1)
dict={}
###Element wird Nummer zugewiesen
while i<n:
#mache was
# print(list_1[i],i)
if list_1[i] in dict:
print("Key vorhanden!");
# print(list_1[i],dict.get(list_1[i])) # Eintrag + value zu Eintrag
d=dict.get(list_1[i])
dict[list_1[i]]=d
list_1[i]=d
else:
y=1[color=#0040FF]Weitere Zählvariable?[/color]
print("Eintrag wird angelegt!")
dict[list_1[i]]=i+1 #Schreibt ins Woerterbuch den Eintrag mit Zaehlnummer i+1
list_1[i]=dict.get(list_1[i])
y=y+1
i=i+1
print dict
Doppelte Einträge werden gefunden und auch richtig zugewiesen. Der einzige Punkt, der gerade noch hapert ist die Nummerierung der neuen Einträge. Da i die Zählvariable der Einträge der Liste ist, wird diese bei jedem Durchgang erhöht. Es ergibt sich im Wörterbuch:
{'a': 1, 'x': 7, 'c': 4, 'b': 2}
Hat sich erledigt. y musste nur außerhalb der Schleife deklariert werden. Danke allen für die Hilfe
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 10:21
von Sirius3
@nick21: Programmieren ist nicht Raten. Jede Zeile, die Du bei der Du nicht erklären kannst, warum sie nötig ist, ist ein Fehler.
Erste Zeile liest die Nummer des Index, zweite Zeile schreibt den selben Index wieder ins Wörterbuch? Warum? Dritte Zeile zerstört die ursprüngliche Liste und überschreibt den Inhalt mit dem Index.
`dict` ist der Name der Wörterbuchklasse und sollte nicht überschrieben werden. Statt while-Schleife wäre hier eine for-Schleife direkt über die Elemente der Liste besser. Eingerückt wird immer mit 4 Leerzeichen pro Ebene:
Code: Alles auswählen
list_1 = ["a","b","a","c","b","a","x"]
index = 0
indices = {}
for entry in list_1:
if entry in indices:
print("Key vorhanden!")
else:
print("Eintrag wird angelegt!")
index += 1
indices[entry] = index
print(indices[entry], entry)
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 10:49
von EyDu
"index" kann man noch durch "len(indices)" ersetzen und sich damit das explizite Zählen sparen.
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 10:50
von nick21
Das die ursprüngliche Liste überschrieben werde soll, ist soweit gewünscht. Die beiden Zeilen darüber sind unnötig, ist angepasst.
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 11:04
von Sirius3
@nick21: Du denkst, dass Du Dir das wünschst, ist aber nicht so. Wenn, dann wünschst Du Dir eine neue Liste:
Code: Alles auswählen
list_1 = ["a","b","a","c","b","a","x"]
indices = {}
index_liste = []
for entry in list_1:
if entry not in indices:
indices[entry] = len(indices) + 1
index_liste.append(indices[entry])
print(list_1)
print(index_liste)
oder kürzer:
Code: Alles auswählen
list_1 = ["a","b","a","c","b","a","x"]
indices = {}
index_liste = [
indices.setdefault(entry, len(indices) + 1)
for entry in list_1
]
print(list_1)
print(index_liste)
Re: enumerate von Listen - doppelte Einträge
Verfasst: Montag 26. März 2018, 11:31
von nick21
Danke dir