我有一个名单:
names = ['ALICE', 'BOB', 'ME']
将'A'
设为1,'B'
设为2,将'C'
设为3 ...“ALICE”的总和可以使用以下公式计算:
sum([ord(i) - ord('A') + 1 for i in 'ALICE']) // ALICE: 30, BOB: 19, ME: 18
现在,我想计算名称中的所有总和乘以names
中的索引,例如30 * 1 + 19 * 2 + 18 * 3 = 122。
这样做很容易:
s = 0
for i in range(len(names)):
s += sum(([ord(j) - ord('A') + 1) * (i + 1) for j in names[i]])
print s
但我想学习列表生成器样式(也许在一行中)。怎么做?
答案 0 :(得分:3)
使用enumerate
:
>>> names = ['ALICE', 'BOB', 'ME']
>>> sum(i * sum(ord(ch) - ord('A') + 1 for ch in name) for i, name in enumerate(names, 1))
122
sum
接受任何可迭代,因此您可以传递生成器表达式而不是列表推导。
>>> enumerate('ALICE')
<enumerate object at 0x7f8f7b8c42d0>
>>> list(enumerate('ALICE'))
[(0, 'A'), (1, 'L'), (2, 'I'), (3, 'C'), (4, 'E')]
>>> list(enumerate('ALICE', 1))
[(1, 'A'), (2, 'L'), (3, 'I'), (4, 'C'), (5, 'E')]