有没有一种方法可以用字典中的值替换另一个列表中的某个列表中的某个值?

时间:2019-05-14 02:16:01

标签: python list dictionary replace

我正在编写一种程序,使用矩阵对某些文本进行加密,并且需要将一些数字替换为字母。到目前为止,这是我的代码:

<html>

但是,出现以下错误:

  

KeyError:'A'

我不知道出什么问题了。抱歉,这是一个不好的问题,但我没有发现任何与此问题类似的问题。

2 个答案:

答案 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

以另一种方式编写内部for循环
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']]