基本条件列表理解,如果条件允许从两个字典中打印值

时间:2019-03-30 08:05:32

标签: python list-comprehension

需要将字母转换为数字。因此,我使用字典来执行任务,但是现在,列表理解出现了问题。

文本既有大写字母又有小写字母,所以我创建了两个字典,一个字典用于大写字母,另一个用于大写字母。 现在,我想创建一个列表,该列表将基于文本中的值从这两个字典中理解。

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 15 14

实际结果:

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

答案 0 :(得分:1)

正如已经提到的评论,您的翻译词典不包含空格' '和点'.';因此您会遇到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.maketransstr.translate

table = str.maketrans('abcdefghijklmnopqrstuvwxyz', 
                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
t = "Learning python."
print(t.translate(table))
# LEARNING PYTHON.

答案 1 :(得分:0)

你可以做,

>>> 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]

答案 2 :(得分:0)

如果使用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]

请注意,上述代码在xspace不包含dot的情况下仍然有效

答案 3 :(得分:0)

更简单:

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