базовое понимание списка с помощью условий if для печати значений из двух словарей - PullRequest
0 голосов
/ 30 марта 2019

требуется для преобразования алфавитов в цифры.Итак, я использовал словарь для выполнения задачи, но теперь, имея проблему с пониманием списка.

текст имеет как прописные, так и маленькие алфавиты, поэтому я создал два словаря, один для маленьких и другой для заглавных букв.Теперь я хочу создать список, который будет понят из этих двух словарей на основе значений, найденных в тексте.

x = 'abcdefghijklmnopqrstuvwxyz'
y = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
data = dict(zip(x, range(1,27)))
data1 = dict(zip(y, range(1,27)))
t = "Learning python."
q = [data[i] if i in data else data1[i] for i in t]
print(" ".join(map(str, q)))

ожидаемый результат: 12 5 1 18 14 9 14 7 16 25 20 8 1514

фактический результат:

File "C:\Users\XXXXX\XXXXX.py", line 6, in <module>

    q = [data[i] if i in data else data1[i] for i in t ]

File "C:\Users\XXXXX\XXXXX.py", line 6, in <listcomp>

    q = [data[i] if i in data else data1[i] for i in t ]

KeyError: ' '

Ответы [ 4 ]

1 голос
/ 30 марта 2019

как уже упоминалось в комментариях, ваши переводы не содержат пробелов ' ' и точек '.'; поэтому вы столкнетесь с KeyError.

это по-другому:

отмечая, что

ord('a') = 97
ord('z') = 122

вы можете использовать bytes:

t = "Learning python."
res = [i - 96 for i in t.lower().encode() if 97 <= i <= 122]
print(res) # [12, 5, 1, 18, 14, 9, 14, 7, 16, 25, 20, 8, 15, 14]

с использованием t.lower() я выполняю преобразование для всех строчных букв, затем я .encode() для объекта bytes (который ведет себя как последовательность целых чисел) и выбираю те из них в диапазоне для печати. ​​


также обратите внимание, что если вам действительно нужно перевести материал в строку, я предлагаю вам использовать str.maketrans и str.translate:

table = str.maketrans('abcdefghijklmnopqrstuvwxyz', 
                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
t = "Learning python."
print(t.translate(table))
# LEARNING PYTHON.
0 голосов
/ 30 марта 2019

Проще:

s = "Learning python."
alpha = "abcdefghijklmnopqrstuvwxyz"
print(*[str(alpha.index(i)+1) if i in alpha else "" for i in s.lower()])

Выход:

12 5 1 18 14 9 14 7  16 25 20 8 15 14 
0 голосов
/ 30 марта 2019

Должно быть проще, если вы используете numpy

import numpy as np

x = 'abcdefghijklmnopqrstuvwxyz .'
# x = 'abcdefghijklmnopqrstuvwxyz'  # still OK
np_x = np.array(list(x))

t = "Learning python."
np_t = np.array(list(t.lower()))
result = list(np.where(np_t.reshape(np_t.size, 1) == np_x)[1] + 1)
# [12,  5,  1, 18, 14,  9, 14,  7, 27, 16, 25, 20,  8, 15, 14, 28]

Обратите внимание, что приведенный выше код все еще работает в случае, если x не включает space или dot

0 голосов
/ 30 марта 2019

Вы могли бы просто сделать,

>>> x = 'abcdefghijklmnopqrstuvwxyz'
>>> y = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> data = dict(zip(x, range(1,27)))
>>> data1 = dict(zip(y, range(1,27)))
>>> t = "Learning python."
>>> [data.get(c, data1.get(c)) for c in t if data.get(c, data1.get(c))] # assuming you don't want the values that are not in the `dict`s
[12, 5, 1, 18, 14, 9, 14, 7, 16, 25, 20, 8, 15, 14]
...