Ich versuche jeden Teil des Benutzernamens auszugeben (wie "n", "ne", "nee", ..., "[email protected]", "e", "ee", ..., "[email protected]" usw.), aber statt von "n" zu "[email protected]" und dann von "e" zu "[email protected]" und dann von "e" bis "[email protected]"; es überspringt einen zusätzlichen einen Brief jedes Mal, obwohl ich nur zu "nächsten" hinzufügen. Es geht von "n" zu "e" (ein Buchstabe voraus, wie es soll) zu "l" (2 Buchstaben voraus) zu "m" (3 Buchstaben voraus) und so weiter. Platziere ich die next += 1
in einer falschen Position?Python: Warum funktioniert meine "Variable + = 1" nicht wie erwartet?
Antwort
Sie brauchen nicht next
zu erhöhen, wenn Sie ein Zeichen für jede Iteration der while-Schleife entfernen möchten:
username = "[email protected]"
usernamelist = []
while len(username) > 0:
for part in accumulate(username):
usernamelist.append(part)
username = username[1:]
print(usernamelist)
Durch next
Erhöhen erhöhen Sie die Anzahl der Zeichen übersprungen werden:
Auf den ersten Iteration: nach username = username[1:]
username
ist "[email protected]"
Am zweiten Iteration: nach username = username[1:]
username
ist "[email protected]"
aber nach username = username[2:]
username
ist "[email protected]"
Sie möchten stattdessen eine for-Schleife verwenden:
username = "[email protected]"
usernamelist = []
for start in range(len(username)):
usernamelist.extend(accumulate(username[start:]))
print(usernamelist)
Aber accumulate
ist nicht sehr effizient. Für große Strings Verwendung Slicing:
username = "[email protected]"
usernamelist = [
username[s:e]
for s, e in combinations(range(len(username)+1), 2)
]
print(usernamelist)
a = "[email protected]" for i in range(0, len(a) + 1): print a[:i]
Ausgabe
n ne nee neel neelk neelka neelkam neelkama neelkamat neelkamath [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]
Dies ist nicht die Ausgabe, die für das OP –
Das Problem ist, dass man «Benutzername» von einem bereits geänderten Wert modifizieren.
Um dies besser zu verstehen, denken, dass die Zeile:
username = username[next:]
ist nicht Teil des ursprünglichen Wertes Kommissionierung ([email protected]), sondern aus der bereits getrimmt (in der vorherige Schleife). Es dreht sich alles darum, was deine Referenz für die nächste Iteration ist.
Dieses Beispiel helfen:
from itertools import accumulate
username1 = "[email protected]"
username2 = "[email protected]"
usernamelist = []
next = 0
while len(username2) > 0:
for part in accumulate(username2):
usernamelist.append(part)
next += 1
username2 = username1[next:]
print(username1)
print(username2)
print(usernamelist)
Nice erforderlich ist. Vielen Dank. – jezrael
Sie können die E-Mail-Adresse für etwas allgemeinere ändern möchten. –
@JacquesGaudin es ist in Ordnung, es ist keine echte E-Mail (es ist eine gelöschte Adresse) –
Einfach überprüfen! –