Проблема в вашем предыдущем коде - это старая 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']]
Обратите внимание, что внутренний цикл 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)
В качестве дополнения можно заставить оригинальный код работать, используя индексы для изменения значения вместо замены элементов, используя 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)