Anderer Wert wenn eine Liste übergeben wird

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
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hi Leute, es geht um diesen Code hier:

Code: Alles auswählen

name = input("Name: ")
final_user_name = ''

for c in range(len(name)):                            
	if not name[c].isnumeric():
		final_user_name += name[c]
print(final_user_name)
Dieses Programm filtert mir die Strings aus dem input heraus.
Wenn ich aus name = input("Name: ") eine Liste mache --> [input("Name: ")] funktioniert das ganze nicht mehr korrekt. Es wird dann die komplette Eingabe inklusive den Zahlen ausgegeben.

Wenn ich z.b als input 'Tim4' eingebe, sucht er dann bei if not name[c].isnumeric(): immer nach vier Listen? Also nach 0, 1, 2, 3?
Falls das so ist, dann wird doch mit 0 'Tim4' übergeben, warum funktioniert der Code dann dennoch nicht richtig?

Außerdem wollte ich noch Frage wie eine Funktion funktioniert, bei dem kein Argument übergeben wird, obwohl einer gefordert wird?

Code: Alles auswählen

def s(x):
    return -x

print(sorted([1,4,7,3,5], key=s))
Hier wird bei key die Funktion s übergeben aber ohne ein argument mit zuübergeben obwohl einer gefordert wird.

Danke für alle Antworten!
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@norgsmen: Also die erste Frage verstehe ich nicht so wirklich. "Tim4" ist halt nicht numerisch, also wird es nicht gefiltert.

Code: Alles auswählen

In [142]: "Tim4".isnumeric()
Out[142]: False
Das ist aber auch ganz schrecklich unpythonischer Code. Man iteriert nicht über Zahlen um die dann als Index zu verwenden, sondern gleich über die Elemente:

Code: Alles auswählen

final_user_name = ""
for character in name:
    if not character.isnumeric():
        final_user_name += character
Und hier ist dann das ``+=`` in der Schleife noch ineffizient. Das macht man nicht. Der idiomatische Weg ist die Ergebnisse in einer Liste zu sammeln und am Ende mit der `join()`-Methode auf Zeichenketten zusammen zu fügen. Oder auch gleich einen Generatorausdruck an die Methode übergeben:

Code: Alles auswählen

final_user_name = "".join(
    character for character in name if not character.isnumeric()
)
Bei der zweiten Frage wird `sorted()` die *Funktion* *übergeben*. Wo sollte denn da welches Argument übergeben werden‽ *Aufgerufen* wird die Funktion dann von `sorted()` und zwar *mit* Argument.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ergänzend zur ersten Frage, wenn der Name in einer Liste steht, dann erreichst du mit dem Index nicht den ersten Buchstaben des Namens, sondern das erste (oder halt je nach Index) Element der Liste:

Code: Alles auswählen

>>>>name = [input("Name: ")]
>>>>Name: >? Tim4
>>>>name
['Tim4']
>>>>name[0]
'Tim4'
>>>>name[0][0]
'T'
Du musst dann also erst auf das Element der Liste zugreifen und dann über dieses Element iterieren und die Zeichen prüfen. Das würde man dann mit zwei 'for'-Schleifen machen, wie __backjack__ gezeigt hat. Der direkte Indexzugriff in meinem Beispiel soll nur darstellen, was sich hinter diesem Index verbiergt.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei etwas das `name` heisst eher keine Liste sein sollte. Und Listen die grundsätzlich immer genau ein Element haben, sollten auch keine Listen sein. Die Lösung wäre also keine zweite Schleife, sondern die unsinnige Liste weg lassen. 🙂
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Ich bin davon ausgegangen, dass die Antwort der nächstens Frage so aussehen könnte:

Code: Alles auswählen

print("Bitte ein paar Namen eingeben, damit die Antwort von Dennis sinn macht :)")
names = [input("Name: ") for _ in range(5)]
🤓
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich erweitere das dann gleich mal:

Code: Alles auswählen

print(
    "Bitte ein paar Namen eingeben, damit die Antwort von Dennis Sinn macht 🙂"
)
names = [
    "".join(
        character for character in input("Name: ") if not character.isnumeric()
    )
    for _ in range(5)
]
😎
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@__blackjack__

zu frage 2: Das ist ja die Frage. wenn die Funktion an sorted() übergeben wird, was nutzt sie dann als Argument? Weil die Funktion ja wie gesagt ein Argument erwartet.

Frage 1: Wenn name = input("Name: ") nicht zur Liste gemacht wird, werden die Buchstaben gefiltert. Bei name = [input("Enter a username: ")]
wird nun alles Ausgegeben, was man als Input eingibt. Die Frage ist daher was genau bewirkt die Liste das jetzt alles Ausgegeben wird, was als input eingegeben wurde statt nur die Buchstaben.
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Die Liste bewirkt, dass der Name in einer Liste steht und man/du weitere Namen in einer Liste sammeln kann. Wie kommst du denn darauf, hier eine Liste zu erstellen bzw. was ist denn dein Ziel? Wenn es dir nur um einen Namen geht, dann brauchst du keine Liste.

Erklärung mit Beispiel zur Liste:
https://docs.python.org/3/tutorial/intr ... html#lists

Als Argument wird der Wert aus deiner Liste benutzt, siehe hier:
https://docs.python.org/3/howto/sorting ... -functions

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@norgsmen: Die Funktion `sorted()` ruft die Funktion die als `key`-Argument übergeben wird auf, mit jedem Element von dem ersten Argument das `sorted()` übergeben wird. Die muss ja für jedes Element heraus finden was der Sortierschlüssel ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten