2016-05-05 7 views
3

Ich bin ein Anfänger bei der Programmierung und ich versuche herauszufinden, wie List-Methoden arbeiten. Ich habe einen kleinen String Scrambler und Decoder für Übungszwecke geschrieben.Verwenden von .insert auf leere Listen

import random 
sliced = [] 
keyholder = [] 
scrambled = [] 
decoded = [] 

def string_slicer(string): 
    i = 0 
    while i < len(string): 
     sliced.append(string[i]) 
     i += 1 

def string_scrambler(string): 
    string = string_slicer(string) 
    a = 0 
    while len(scrambled) != len(sliced): 
     value = len(sliced) - 1 
     key = random.randint(0,value) 
     if key in keyholder: 
      continue 
     else: 
      scrambled.append(sliced[key]) 
      keyholder.append(key) 
     continue 

def string_decoder(): 
    x = 0 
    for item in keyholder: 
     decoded.insert(keyholder[x], scrambled[x]) 
     x += 1 

string_scrambler('merhaba') 
string_decoder() 

print sliced 
print keyholder 
print scrambled 
print decoded 

Wenn ich den string_scrambler() bin Tests funktioniert gut, aber die string_decoder() gibt zufällige Ergebnisse. Hier sind einige Beispiele:

C:\Python27\Exercises>python scrambler.py 
['m', 'e', 'r', 'h', 'a', 'b', 'a'] 
[2, 6, 0, 1, 3, 5, 4] 
['r', 'a', 'm', 'e', 'h', 'b', 'a'] 
['m', 'e', 'r', 'h', 'a', 'a', 'b'] 

C:\Python27\Exercises>python scrambler.py 
['m', 'e', 'r', 'h', 'a', 'b', 'a'] 
[4, 5, 1, 0, 3, 2, 6] 
['a', 'b', 'e', 'm', 'h', 'r', 'a'] 
['m', 'a', 'r', 'e', 'h', 'b', 'a'] 

C:\Python27\Exercises>python scrambler.py 
['m', 'e', 'r', 'h', 'a', 'b', 'a'] 
[1, 4, 5, 2, 3, 0, 6] 
['e', 'a', 'b', 'r', 'h', 'm', 'a'] 
['m', 'e', 'a', 'r', 'h', 'b', 'a'] 

Ich denke, versuchen einige Elemente in eine leere Liste mit .Insert Methode hinzufügen kann dieses Problem verursachen. Aber ich kann nicht genau herausfinden warum.

Antwort

2

Beachten Sie, dass viele Ihrer Funktionen gar nicht notwendig sind.

>>> list("some string") 
["s", "o", "m", "e", " ", "s", "t", "r", "i", "n", "g"]` 
# just like your `string_slicer` function. 

Vor allem das Problem mit Ihrem Ansatz ist, dass Sie zu tun versuchen könnte, zum Beispiel:

>>> lst = [] 
>>> lst.insert("after", 3) 
>>> lst.insert("before", 2) 
>>> lst 
["after", "before"] 

Da die Liste zunächst Länge Null ist, Einfügen Vergangenheit der Endpunkt es nur bis zum Ende sendet der Liste. Obwohl 3 eine entferntere Index als 2 ist, nicht um es nicht richtig, da im Wesentlichen Sie

lst.append("after") 
lst.append("before") 

Stattdessen getan haben, können Sie so etwas wie tun könnte:

scrambled = [''] * len(sliced) 
# build a list of the same length as the cleartext sliced string 

for idx, dest in enumerate(keyholder): 
    scrambled[dest] = sliced[idx] 

Dann entwürfeln tun das Gegenteil

deciphered = [''] * len(scrambled) 
for idx, dest in enumerate(keyholder): 
    deciphered[idx] = scrambled[dest] 

die vollständige Lösung, die ich, darunter auch einige andere Tricks anwenden würde, ist:

import random 

def make_key(lst): 
    return random.shuffle(range(len(lst))) 

def scramble(lst, key): 
    result = [''] * len(lst) 
    for idx, dst in enumerate(key): 
     result[dst] = lst[idx] 
    return result 

def unscramble(scrambled, key): 
    return [scrambled[idx] for idx in key] 

s = "merhaba" 
key = make_key(list(s)) 

scrambled = scramble(list(s), key) 
deciphered = unscramble(scrambled, key) 

print(list(s)) 
print(key) 
print(scrambled) 
print(deciphered) 

N.B. Dies entfernt jede einzelne Listenmethode, die Sie überhaupt erst lernen wollten! Sie sollten dies bemerken, da dies darauf hinweist, dass Listenmethoden langsam sind (mit Ausnahme von append und pop), und Sie sollten wahrscheinlich vermeiden, sie zu verwenden, wenn eine andere, gleichermaßen lesbare Lösung existiert.

-1

Ich denke, es ist besser, nicht list als Datenstruktur für decoded zu verwenden. I dict als temporäre Variable verwenden würde, hier ist meine Version von string_decoder:

_decoded = dict() # changed 

def string_decoder(): 
    x = 0 
    for item in keyholder: 
     _decoded[keyholder[x]] = scrambled[x] #changed 
     x += 1 

    return [value for key, value in sorted(_decoded.items())] #changed 

decoded = string_decoder() 

BTW, Sie Probleme mit list.insert() haben, weil Sie Werte in eine Liste in die Position einzufügen, die nicht vorhanden ist, z.B. 4. Element zu einer Liste von 2 Elementen hinzufügen.

Beispiel für das Verhalten:

>>> decoded = [] 
>>> decoded.insert(100, 'b') 
>>['b'] 
>>> decoded.insert(99, 'a') 
>>> decoded 
['b', 'a'] # according to your code, you expect ['a', 'b'] because 99 is less than 100, but the list has not enough entries. So, the item is just appended to the end 
+1

warum? Ich meine, da der Schlüssel immer eine Zahl sein wird, die einem Index entspricht, sehe ich keinen Grund, Indizes nicht einfach zu verwenden. –

+0

@AdamSmith Ich habe gerade meine Antwort mit dem Codebeispiel bearbeitet. –

+1

Huh? Dies hat meinen Kommentar nicht angesprochen –

Verwandte Themen