2016-05-26 6 views
0

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?

+0

Sie können die E-Mail-Adresse für etwas allgemeinere ändern möchten. –

+0

@JacquesGaudin es ist in Ordnung, es ist keine echte E-Mail (es ist eine gelöschte Adresse) –

+0

Einfach überprüfen! –

Antwort

3

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]"

2

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) 
2

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) 
+0

Nice erforderlich ist. Vielen Dank. – jezrael