Есть ли способ заменить определенное значение в списке, который находится в другом списке, значением из словаря? - PullRequest
1 голос
/ 14 мая 2019

Я кодирую некую программу для шифрования текста с использованием матриц, и мне нужно заменить некоторые цифры на буквы. Это мой код:

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'

Я понятия не имею, что не так. Извините, если это плохой вопрос, но я не нашел ни одного подобного вопроса.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Проблема в вашем предыдущем коде - это старая 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)
1 голос
/ 14 мая 2019

Вы можете использовать понимание списка с list(map(...)):

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

То, что выводит:

[['A', 'A', 'A'], ['A', 'A', 'A']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...