我正在尝试编写一个带有长串字母和字符的程序,并创建一个{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:
答案 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
>>>
要解决此问题,您可以:
停止从循环内的all_chars
中删除元素。这样,它的长度始终为66
。
使用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')解决这个问题。