2017-12-24 3 views
0

Ich versuche, eine Zeichenfolge "Zeichenfolge" zu verschlüsseln, ohne random.shuffle() zu verwenden, aber mein Code produziert weiterhin Ausgabe, die fehlende und sich wiederholende Zeichen, z. gtrgtg, gnrtnn usw. Ich bin mir nicht sicher, was ich falsch mache.Eine Zeichenfolge in Python ohne Verwendung von random.shuffle() verschmelzen

import random 
    s = "string" 
    new_s=[] 
    for c in s: 
     if random.choice(s) not in new_s: 
     new_s.append(random.choice(s)) 

    print(''.join(new_s)) 

Antwort

0

versuchen Sie dies:

from random import randint 

def shuffle(sr): 
    n = len(sr) 
    s = list(sr) 
    for i in range(n): 
     cur, idx = s[i], randint(0, n - 1) 
     s[i], s[idx] = s[idx], cur 
    return ''.join(s) 

print(shuffle("hello")) 
1

random.choice choses ein zufälliges Zeichen aus String s, sich aber nicht entfernen - so ist es möglich, das gleiche Zeichen mehrmals gewählt werden, und für einig Zeichen, um überhaupt nicht gewählt zu werden.

import random 

s = 'string' 
new_s = [] 

# rather than choosing a character, chose an index, use it and slice it out 
while s: 
    i = random.randint(0, len(s)-1) 
    new_s.append(s[i]) 
    s = s[:i] + s[i+1:] 
print(''.join(new_s)) 

# this is more elegant with lists: 
s = list(s) 
while s: 
    i = random.randint(0, len(s)-1) 
    new_s.append(s.pop(i)) 
print(''.join(new_s)) 

Weder Option ist sehr effizient ... aber für Effizienz, random.shuffle verwenden. :)

2

In seinem aktuellen Zustand überprüft Ihr Programm, ob das zufällig gewählte Zeichen in einer Zeichenfolge ist. Wenn dies der Fall ist, macht es nichts anderes als die Schleife fortzusetzen. Da Sie auch random.choice(s) keiner Variablen zuweisen, generieren Sie nach der Überprüfung ein weiteres Zeichen.

würde eine Arbeitsversion sein:

import random 
s = "string" 
new_s = [] 
for c in s: 
    char = random.choice(s) # assign it to a variable 
    while char in new_s: # until a new character comes, repeat the procedure 
     char = random.choice(s) 
    new_s.append(char) 

print(''.join(new_s)) 

Dies erzeugt Strings wie ngtsri, gsrnit usw. Beachten Sie, dass diese, wenn Sie Duplikate nicht funktioniert in der ursprünglichen Zeichenfolge haben.

Der obige Code ist sehr ineffizient. Ich habe nur die Korrektur gegeben, vorausgesetzt, dies war für Lernzwecke. Wenn Sie regelmäßig überprüfen möchten, ob sich etwas in einer Sammlung befindet, sollte diese Sammlung normalerweise eine Gruppe oder ein Wörterbuch sein.

+0

Sie haben Ihre Annahme richtig. –

1

Mit while, könnten Sie eine Schleife durch s, bis die Länge von new_s Einstimmungen mit der s und die resultierende Zeichenfolge nicht wiederholende Zeichen hat.

import random 

s = "string" 
new_s = '' # So you will not need ''.join() when you print this result 

while len(new_s) != len(s): 
    char = random.choice(s) 
    if char not in new_s: 
     new_s += char 

print(new_s) 

rntigs 
>>> 
Verwandte Themen