使用随机密码进行编码

时间:2014-11-10 02:23:05

标签: python dictionary

我正在尝试编写一个带有长串字母和字符的程序,并创建一个{original character:random character}的字典。它应该删除已经分配了随机值的字符。 这就是我所拥有的:

import random
all_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?'

def make_encoder(all_chars):
    all_chars=list(all_chars)
    encoder = {}
    for c in range (0,len(all_chars)):
        e = random.choice(all_chars)
        all_chars.remove(e)
        key = all_chars[c]
        encoder[key] = e
    return encoder

我一直在{10} index out of range: 33

获得key = all_chars[c]

这是我的整个代码,修复了第一个问题:

import random
all_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?'

def make_encoder(all_chars):
    list_chars= list(all_chars)
    all_chars= list(all_chars)
    encoder = {}
    i=0
    while len(encoder) < len(all_chars):
        e = random.choice(all_chars)
        key = all_chars[i] 
        if key not in encoder.keys():
            encoder[key] = e
            i += 1
    return encoder

def encode_message(encoder,msg):
    encoded_msg = ""
    for x in msg:
        c = encoder[x]
        encoded_msg = encoded_msg + c

def make_decoder(encoder):
    decoder = {}
    for k in encoder:
        v = encoder[k]
        decoder[v] = k
    return decoder

def decode_message(decoder,msg):
    decoded_msg = ""
    for x in msg:
        c = decoder[x]
        decoded_msg = decoded_msg + c

def main():
    alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.!?"
    e = make_encoder(alphabet)
    d = make_decoder(e)
    print(e)
    print(d)
    phrase = input("enter a phrase")
    print(phrase)
    encoded = encode_message(e,phrase)
    print(encoded)
    decoded = decode_message(d,encoded)
    print(decoded)

我现在获得了TypeError: iteration over non-sequence of type NoneType

for x in msg:

5 个答案:

答案 0 :(得分:0)

您正在改变列表。要点:迭代时不要改变列表。

for c in range (0,len(all_chars)):这一行将迭代到列表的长度,但同时你删除了元素,所以列表被改变了,这就是为什么你的列表超出范围。

尝试这样:

import random
all_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?'

def make_encoder(all_chars):
    all_char = list(all_chars)
    encoder = {}
    i=0
    while len(encoder) < len(all_char):
        e = random.choice(all_char)
        key = all_char[i] 
        if key not in encoder.keys():
            encoder[key] = e
            i += 1
    return encoder

输出:

>>> make_encoder(all_chars)
{'!': '3', ',': 'l', '.': 'J', '1': 'y', '0': 'l', '3': 'G', '2': ',', '5': '6', '4': 'f', '7': 'f', '6': 'C', '9': 'F', '8': 'y', '?': 'S', 'A': 'm', 'C': 'z', 'B': 'b', 'E': 'J', 'D': '0', 'G': 'S', 'F': 'v', 'I': 'v', 'H': '?', 'K': 'd', 'J': 'X', 'M': 'o', 'L': 'O', 'O': 'Q', 'N': 'P', 'Q': 'Z', 'P': '8', 'S': 'r', 'R': 'h', 'U': 'o', 'T': 'M', 'W': 'l', 'V': '.', 'Y': 'R', 'X': 'C', 'Z': 'a', 'a': 's', 'c': 'Y', 'b': 'X', 'e': 's', 'd': 'd', 'g': 'L', 'f': 'G', 'i': 'm', 'h': 'k', 'k': 'f', 'j': '1', 'm': 'J', 'l': 'L', 'o': '2', 'n': 'N', 'q': 'n', 'p': 'l', 's': 'W', 'r': '7', 'u': 'y', 't': 'S', 'w': 'J', 'v': 'E', 'y': 'r', 'x': 'C', 'z': 'i'}

答案 1 :(得分:0)

在迭代迭代时,永远不应该修改它。

考虑一下:你告诉Python从0循环到列表all_chars的长度,开头是66。但是你用all_chars.remove(e)不断缩短这个长度。因此,循环仍然循环66次,但all_chars只有第一次迭代的66项。之后,它有65,然后是64,然后是63等。

最终,当IndexError等于列表的长度(发生在c时)时,您将遇到c==33。请注意,当c 更大而不是长度时,因为Python索引从0开始:

>>> [1, 2, 3][3]  # There is no index 3 because 0 is the first index
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> [1, 2, 3][2]  # 2 is the greatest index
3
>>>

要解决此问题,您可以:

  1. 停止从循环内的all_chars中删除元素。这样,它的长度始终为66

  2. 使用while True:循环并在all_chars为空(用完字符)时中断。

答案 2 :(得分:0)

您在迭代时修改列表:

for c in range(0,len(all_chars)):
    e = random.choice(all_chars)
    all_chars.remove(e)

范围项range(0,len(all_chars))仅在for循环开始时生成。这意味着它总是假定它的长度是它的开始。

删除字符all_chars.remove(e)后,现在列表比for循环开始时短一个项目,导致最终的溢出。

相反如何:

while all_chars:    # While there are chars left in the list
    ...

答案 3 :(得分:0)

我建议制作两个字符串或者至少将两个数据库分开。

import random
all_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?'

def make_encoder(all_chars):
    list_chars= list(all_chars)
    all_chars= list(all_chars) #<-------------EDIT
    encoder = {}
    for c in all_chars:
        e = random.choice(list_chars)
        list_chars.remove(e)
        key = c #<---------------EDIT
        encoder[key] = e
    return encoder<--------EDIT, unindented this line.

这是你的问题,因为你正在从你正在迭代的列表中删除。制作两个列表虽然有点乱,但却是最好的方法。

答案 4 :(得分:0)

您不必从初始字符串中删除它(在迭代时更改项目是不好的做法)

只需检查该项目是否已存在于dictonary中。

import random

all_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?'
encoder = {}

n = 0
while len(all_chars) != len(encoder):
    rand = random.choice(all_chars)
    if rand not in encoder:
        encoder[all_chars[n]] = rand
        n += 1

for k,v in sorted(encoder.iteritems()):
    print k,v

顺便说一句,你的编码器可以正常工作,但由于你使用随机因素来构建编码器,你无法解码它。你可以使用random.seed('KEY')解决这个问题。