在Python中,我需要生成一个dict
,用于将字母映射到该字母的预定义“one-hot”表示。举例来说,dict
应如下所示:
{ 'A': '1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0',
'B': '0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0', # ...
}
每个字母的字母有一位(表示为字符)。因此,每个字符串将包含25个零和一个1. 1
的位置由字母表中相应字母的位置决定。
我想出了一些生成此代码的代码:
# Character set is explicitly specified for fine grained control
_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
n = len(_letters)
one_hot = [' '.join(['0']*a + ['1'] + ['0']*b)
for a, b in zip(range(n), range(n-1, -1, -1))]
outputs = dict(zip(_letters, one_hot))
是否有更高效/更清洁/更pythonic的方式来做同样的事情?
答案 0 :(得分:7)
我觉得这更具可读性:
from string import ascii_uppercase
one_hot = {}
for i, l in enumerate(ascii_uppercase):
bits = ['0']*26; bits[i] = '1'
one_hot[l] = ' '.join(bits)
如果您需要更通用的字母表,只需枚举一串字符,然后将['0']*26
替换为['0']*len(alphabet)
。
答案 1 :(得分:2)
在Python 2.5及更高版本中,您可以使用条件运算符:
from string import ascii_uppercase
one_hot = {}
for i, c in enumerate(ascii_uppercase):
one_hot[c] = ' '.join('1' if j == i else '0' for j in range(26))
答案 2 :(得分:1)
one_hot = [' '.join(['0']*a + ['1'] + ['0']*b)
for a, b in zip(range(n), range(n-1, -1, -1))]
outputs = dict(zip(_letters, one_hot))
特别是,这两行中包含 lot 代码。您可以尝试Introduce Explaining Variable重构。或者是extract method。
以下是一个例子:
def single_onehot(a, b):
return ' '.join(['0']*a + ['1'] + ['0']*b)
range_zip = zip(range(n), range(n-1, -1, -1))
one_hot = [ single_onehot(a, b) for a, b in range_zip]
outputs = dict(zip(_letters, one_hot))
虽然您可能不同意我的命名。
答案 3 :(得分:-1)
对我来说,这看起来非常清晰,简洁,和Pythonic。