enumerate von Listen - doppelte Einträge

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
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wenn Du am Montag in Ruhe noch einmal anfängst, dann könntest Du statt der items deren Ids als keys verwenden:

Code: Alles auswählen

item_id = id(item)
So dürfen dann auch mutable Objekte in den Iterables enthalten sein.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__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.
nick21
User
Beiträge: 11
Registriert: Freitag 23. März 2018, 09:28

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@nick21: Programmieren ist nicht Raten. Jede Zeile, die Du bei der Du nicht erklären kannst, warum sie nötig ist, ist ein Fehler.

Code: Alles auswählen

    d=dict.get(list_1[i])
    dict[list_1[i]]=d
    list_1[i]=d
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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

"index" kann man noch durch "len(indices)" ersetzen und sich damit das explizite Zählen sparen.
Das Leben ist wie ein Tennisball.
nick21
User
Beiträge: 11
Registriert: Freitag 23. März 2018, 09:28

Das die ursprüngliche Liste überschrieben werde soll, ist soweit gewünscht. Die beiden Zeilen darüber sind unnötig, ist angepasst.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
nick21
User
Beiträge: 11
Registriert: Freitag 23. März 2018, 09:28

Danke dir
Antworten