2013-10-29 37 views
0

我有名字的列表:的Python有兩個相關變量循環

names = ['ALICE', 'BOB', 'ME'] 

'A'爲1,'B'爲2,'C'爲3 ...「愛麗絲」的總和可以用下式計算:

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 

但我想學習在列表生成器樣式(也許在一行中)做到這一點。這個怎麼做?

回答

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')] 
+1

第一個例子是不好的,你使用'i'兩次。 – glglgl

+1

@glglgl,我修好了。感謝您指出它。 – falsetru