【问题标题】:Is there a way to replace a certain value in a list that is in another list with a value from a dictionary?有没有办法用字典中的值替换另一个列表中的某个列表中的某个值?
【发布时间】:2019-09-30 23:47:56
【问题描述】:

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

letters = {"1": "A"}
X = [[1, 1, 1],[1, 1, 1]]
for list_in in X:
    for number in list_in:
        new_value = letters[str(number)]
        list_in[number] = new_value
for row in X:
    print(row)

但是,我收到以下错误:

KeyError: 'A'

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

【问题讨论】:

  • 所以你想根据你的letters替换列表(或列表列表)中的所有元素,结果类似于[['A', 'A', 'A'], ['A', 'A', 'A']]
  • @Chris 没错!!

标签: python list dictionary replace


【解决方案1】:

您早期代码中的问题是古老的Iterating on the list while modifying it,它导致了异常。

当您执行list_in[number] = new_value 时,您正在内部循环中修改list_in,同时在它上面进行迭代,这会导致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']]

请注意,内部 for 循环也可以使用 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)

注意,这相当于下面的传统双 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)

作为附录,可以使用enumerateenumerate 使用索引来更改值而不是替换项目来使原始代码工作

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)

【讨论】:

  • 其中一个版本是我的
  • 您的代码实际上无法运行并引发我修复的异常 @U9-Forward !因此,它与您的略有不同,无论如何,如果您愿意,我可以删除该部分:)
  • @DeveshKumarSingh 已编辑
  • 太棒了!很高兴您发现问题,所以如果您愿意,我现在可以从我的答案中删除该部分 @U9-Forward !
  • @DeveshKumarSingh Nah,保持这样,为你 +1
【解决方案2】:

您可以将列表推导与list(map(...)) 一起使用:

print([list(map(lambda x: letters[str(x)], i)) for i in X])

输出的东西:

[['A', 'A', 'A'], ['A', 'A', 'A']]

【讨论】:

  • @Vitor 乐于助人 :-)
猜你喜欢
  • 2019-03-18
  • 2014-10-08
  • 2021-12-12
  • 2018-10-13
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多