我正在编写一种程序,使用矩阵对某些文本进行加密,并且需要将一些数字替换为字母。到目前为止,这是我的代码:
<html>
但是,出现以下错误:
KeyError:'A'
我不知道出什么问题了。抱歉,这是一个不好的问题,但我没有发现任何与此问题类似的问题。
答案 0 :(得分:2)
您之前的代码中的问题是一个古老的Iterating on the list while modifying it
,它引起了异常。
在进行list_in
时,您正在内部循环中修改list_in[number] = new_value
并对其进行迭代,这将导致new_value
在下一个循环中变为A
不是letters
中的有效密钥,因此会出现错误KeyError: 'A'
我建议使用列表理解来实现您想要的,在迭代旧列表的同时创建一个新列表,这就是我们希望发生的事情
letters = {"1": "A"}
X = [[1, 1, 1],[1, 1, 1]]
res = [[letters[str(item)] for item in li] for li in X ]
print(res)
#[['A', 'A', 'A'], ['A', 'A', 'A']]
请注意,也可以使用map
letters = {"1": "A"}
X = [[1, 1, 1],[1, 1, 1]]
res = [list(map(lambda x:letters[str(x)], li)) for li in X ]
print(res)
请注意,这等效于以下传统的double for循环,可能更容易理解
letters = {"1": "A"}
X = [[1, 1, 1],[1, 1, 1]]
res = []
#Iterate over outer list
for li in X:
l = []
#Iterate over inner list and append A for inner list
for item in li:
l.append(letters[str(item)])
#Append this list to a bigger list
res.append(l)
print(res)
作为附录,可以使用enumerate
letters = {"1": "A"}
X = [[1, 1, 1],[1, 1, 1]]
#Iterate over the lists
for i, li in enumerate(X):
for j, item in enumerate(li):
#Replace value at index i,j with A
X[i][j] = letters[str(item)]
print(X)
答案 1 :(得分:1)
您可以对list(map(...))
使用列表推导:
print([list(map(lambda x: letters[str(x)], i)) for i in X])
输出内容:
[['A', 'A', 'A'], ['A', 'A', 'A']]