Abgleich von Listen mit Groß/Kleinschreibung

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
Skolion
User
Beiträge: 1
Registriert: Montag 27. August 2018, 15:13

Hallo, hätte mal eine Frage da ich gerade Python lerne und nicht weiterkomme. Ich habe zwei Listen mit Benutzernamen. Diese könnten groß, klein oder gemischt geschrieben worden sein. Ich möchte nun beide Listen mit einer schleife abgleichen aber beide Listen davor auf Kleinschreibung bringen, damit nicht der Benutzer "John", "JOhn", oder "John" z.B.vorkommen können. Sondern eben nur ein "John".
mein Code sieht so aus, alles geht nur ich weiß nicht wie ich die erste Liste auf Kleinschreibung zum abgleichen formatieren kann, da ich ja user.lower() machen kann aber nicht current_users.lower()

current_users = ['martin','peTer', 'hanS', 'sven', 'oliver']

new_users = ['Thilo','chris', 'Felix', 'Georg', 'Oliver']

for user in new_users:
if user in current_users:
print(user + " is already in use.")
else:
print("Username is free.")
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Skolion hat geschrieben: Montag 27. August 2018, 15:25 alles geht nur ich weiß nicht wie ich die erste Liste auf Kleinschreibung zum abgleichen formatieren kann, da ich ja user.lower() machen kann aber nicht current_users.lower()
Du kannst die current_users doch vor Beginn der Schleife einmal durchlaufen und klein machen:

Code: Alles auswählen

lowered_users = [user.lower() for user in current_users]
...und damit gleichst du es dann ab.

Und es macht natürlich Sinn, direkt neben der Original-Schreibweise auch die kleine Schreibweise für neue Benutzernamen zu speichern, falls möglich. Dann muss der Schritt nicht jedes Mal für die komplette Liste erfolgen.

Und schau dir mal den Datentyp set() an. Damit funktionieren in-Abfragen deutlich schneller, sofern man viele Elemente hat. Auch hier aber nur sinnvoll, wenn man das Set der aktuellen Benutzer "behalten" kann. Falls du immer nur an diese Liste kommst (z.B. über eine API geliefert), dann bleib bei der Liste.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Außerdem: Wenn man primär Mengenoperationen (wie `in`) benötigt, bietet sich eine Menge (→ `set`) eher an als eine Liste:

Code: Alles auswählen

lowered_users = {user.lower() for user in current_users}
Mengenoperationen sind auf `set`s effizienter implementiert als auf Listen; und außerdem drück das `set` die Intention des Programmierers besser aus.

Wenn zusätzlich der Name in Originalschreibweise gespeichert werden soll, dann würde ich ein Wörterbuch nehmen:

Code: Alles auswählen

current_users = {user.lower(): user for user in current_users}

for user in new_users:
    if user.lower() in current_users:
        print("taken")
    else:
        print("free")
Antworten