Python: Prüfen ob Wert in Liste bereits existiert?
Hallo,
Ich habe in Python einen Array namens Liste mit dem Wert:
["10 Test 3", "20 Test 2", "30 Test 3"]
Also jeder Wert in dem Array fängt mit einer Zahl an. Der Benutzer des Programms kann selber einen Wert hinzufügen. Da kann es sein das der Array am Ende beispielsweise so aussieht: ["10 Test 3", "20 Test 2", "30 Test 3", "20 Hallo!"]
Aber es soll jede Anfangszahl nur einmal geben. Wie kann ich überprüfen ob die Zahl am Anfang eines Wertes bereits da ist und den älteren Wert mit dieser Anfangszahl überschreiben? (Die Zahl am Anfang kann immer anders sein)
Also in diesem Beispiel müsste das so aussehen:
Vorher:
["10 Test 3", "20 Test 2", "30 Test 3", "20 Hallo!"]
Nachher:
["10 Test 3", "20 Hallo!", "30 Test 3"]
Wie kann ich das machen? Gibt es dafür eine Funktion?
LG
Es muss doch eine Möglichkeit geben oder? Kann mir irgendjemand helfen?
PS: Wenn ihr mir sagt wie das geht bitte auch Code posten. Sonst weiß ich nicht wie ich das machen kann weil ich erst seit kurzer Zeit mit Python arbeite.
Viele schreiben mir wie ich das machen könnte. Aber leider verstehe ich davon nicht viel weil ich neu in Python bin. Beispielcode? Wie funktionieren diese Dictionarys? Wie muss ich sie benutzen?
Langsam verzweifel ich. Ich kann schon seit 3 Tagen nicht mehr an meinem Projekt arbeiten
7 Antworten
Selbst wenn es dafür eine Funktion gäbe, wäre es nicht unbedingt zielführend. Verwende doch die Zahl als Key und nicht im Wert. Dann werden gleiche Schlüssel auch mit neuen Werten überschrieben.
Du verwendest - wie hier schon beschrieben ein Dictionary. https://docs.python.org/3/tutorial/datastructures.html#dictionaries
Leeres Dictionary initialisieren und dann Zahl = Key, Rest = Value.
Iteriere über die Liste und prüfe ob das gesuchte Teil des Objektes ist. Sinnvoller wäre die Nutzung eines Dictionaries.
list=["20 hi", "30 hi", "40 hi", "20 bye"]
zahlenwerte=[]
for item in list:
if item[0:1] in zahlenwerte:
zahlenwerte.append(item[0:1])
else:
list.remove(item)
#Man erstellt eine zweite Liste nur mit den Zahlenwerten, funktioniert aber leider nur, wenn alle Zahlen zweistellig sind und am Anfang kommen
Leider kann die Zahl auch nur eine, zwei, drei usw Stellen haben.
list=["5 hi", "15 hi", "45 hi", "150 hi", "69 hi", "45 bye"]
zahlenwerte=[]
for item in list:
zahlenwert=""
counter=0
for char in item:
try:
int(char)
counter+=1
except:
continue
if int(item[0:counter]) in zahlenwerte:
list.remove(item)
zahlenwerte.append(int(item[0:counter]))
print(list)
Ok, habe ich geschrieben. Aber wenn jezt noch einmal eine Zahl dazukommt die schon da war, crasht es mit folgender Meldung:
TypeError: descriptor 'remove' for 'list' objects doesn't apply to a 'str' object
Oh, mein Fehler. list war ein Keyword. Ich habe es umbennant.
Hmmm... Wenn man schreibt: for x in list: list.remove(x) sollte x in der Liste sein, wenn man es nicht davor verändert. Ich kann dir leider nicht helfen, bei mir funktioniert es.
Würdest du die Anfangszahlen in ein Dictionary einsortieren würdest du dir das Leben viel einfacher machen, weil halt ein Schlüssel in einem dict nur ein mal vorkommen kann.
Wenn du darauf bestehst das es als String genau so in einer list sein soll müsstest du durch die list iterieren und bei jedem String überprüfen ob die Zahl am Anfang bereits erwähnt wurde.
Um diese Zahl aus dem String zu extrahieren, kommt darauf an, ob du voraussetzt das nach der Zahl ein Lehrzeichen kommt oder ob du alle Digits am Anfang herausholen willst. Das letztere wäre mit RegEx recht effektiv umsetzbar. Das erstere mit einem String.split
Um zu überprüfen ob die Zahl erwähnt wurde könntest du eine weitere Liste machen wo du jede Zahl einfügst und dann prüfst ob sie schon vorkommt.
Ich werde dir das nicht vorschreiben.
Er hat folgendes geschrieben:
PS: Wenn ihr mir sagt wie das geht bitte auch Code posten. Sonst weiß ich nicht wie ich das machen kann weil ich erst seit kurzer Zeit mit Python arbeite.
Ich hab meine Antwort schon vor dieser Ergänzung geschrieben.
Wie kann ich den jede Anfangszahl in dieses Dictionary einsortieren?
Du solltest beim Einfügen prüfen, dass der Wert überschrieben wird, wenn der jeweilige Schlüssel bereits enthalten ist. Eine mögliche Implementierung könnte so aussehen:
def extract_key_value(entry):
idx = 0
alphabet = [str(k) for k in range(10)]
while entry[idx] in alphabet:
idx += 1
if idx < 1:
raise ValueError('Invalid format.')
return entry[:idx], entry[idx:].lstrip()
def add_entry(data, new_entry):
key, val = extract_key_value(new_entry)
candidates = [idx for idx, entry in enumerate(data) if extract_key_value(entry)[0] == key]
if len(candidates):
data[min(candidates)] = new_entry
else:
data.append(new_entry)
def main():
data = ['10 Test 3', '20 Test 2', '30 Test 3']
print(data)
new_entry = '20 Hallo!'
add_entry(data, new_entry)
print(data)
if __name__ == '__main__':
main()
Und wie kann ich das machen?