Python 为字母赋值并对序列求和(不基于字母顺序)

Python 为字母赋值并对序列求和(不基于字母顺序),python,Python,在Python中,我想知道是否可以给序列中的一个字母赋值,然后请求该序列的和。到目前为止,我只看到了字母顺序。我有一个序列列表: 例如:ACEPAAG(每行一个序列),并希望为字母赋值:A=100,p=150等,然后对该序列求和 到目前为止,我遇到了以下情况: import string d = {c: i for i,c in enumerate(string.ascii_uppercase, 150)} d word = "AGP" score = sum(d[c] for c in wo

在Python中,我想知道是否可以给序列中的一个字母赋值,然后请求该序列的和。到目前为止,我只看到了字母顺序。我有一个序列列表:

例如:
ACEPAAG
(每行一个序列),并希望为字母赋值:
A=100
p=150
等,然后对该序列求和

到目前为止,我遇到了以下情况:

import string
d = {c: i for i,c in enumerate(string.ascii_uppercase, 150)}
d 
word = "AGP"
score = sum(d[c] for c in word)
score

我知道这只是增加了150到和字母表,有没有办法改变这一点,让我可以选择什么值与哪个字母

我建议创建一个包含所有值的列表v,其中索引0处的值表示a,索引25处的值表示Z,等等

然后,使用“i”作为v的索引,而不是使用“i”:

a = {c: v[i] for i,c in enumerate(string.ascii_uppercase)}
通过这种方式,您可以选择希望每个字母的值

请记住,要使其正常工作,v中必须至少有26个元素,否则您将得到一个索引超出范围的错误

我想知道是否可以给序列中的一个字母赋值,然后求序列的和

我不知道你在做什么,所以我只想根据我认为你在做什么来回答。你想把一系列字母的ASCII值相加,对吗

sequence_of_letters = "A sequence of letters and characters is better known as a string!"

print sum([ord(x) for x in sequence_of_letters]) # ord gives you the ASCII value
>>>6049

这就是您要找的吗?

您可以将两个列表映射到一个字典中,如:

l = map(chr, range(65, 91))

print l
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

n = range(0, 27)

print n
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

d = dict(zip(l,n))

print d
{'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3, 'G': 6, 'F': 5, 'I': 8, 'H': 7, 'K': 10, 'J': 9, 'M': 12, 'L': 11, 'O': 14, 'N': 13, 'Q': 16, 'P': 15, 'S': 18, 'R': 17, 'U': 20, 'T': 19, 'W': 22, 'V': 21, 'Y': 24, 'X': 23, 'Z': 25}
因此,您可以加入一个包含所需数字的列表

score = sum(d[c] for c in word)
print score
21

关于你在我的回答中的评论:

用这样的行归档:

156, 731, 942, 15, 514, 48, 95, 607, 282, 30, 733, 444, 135, 367, 236, 404, 799, 276, 854, 937, 469, 450, 999, 327, 970, 716, 96    
621, 536, 358, 502, 745, 583, 899, 653, 496, 311, 451, 951, 819, 658, 77, 44, 593, 523, 754, 326, 647, 232, 916, 806, 289, 529, 918
代码如下:

156, 731, 942, 15, 514, 48, 95, 607, 282, 30, 733, 444, 135, 367, 236, 404, 799, 276, 854, 937, 469, 450, 999, 327, 970, 716, 96    
621, 536, 358, 502, 745, 583, 899, 653, 496, 311, 451, 951, 819, 658, 77, 44, 593, 523, 754, 326, 647, 232, 916, 806, 289, 529, 918

谢谢你,Andre,这真的很好,我现在唯一的问题是把它放入一个循环中,这样我就可以一行一行地做这个了。我设置了两张地图,然后尝试:::用open('*.txt',r')作为f:for line in f:if'str'in line:break for line in f:score=sum(d[c]for c in line)打印分数,但这似乎不起作用,你能解释一下为什么不起作用吗?@Vron当然,我不太明白,但我会尝试评论!如果有,请逐行设置。您可以创建一个文件*.txt,其中每行包含27个由逗号分隔的数字。在那之后,做一个循环读取这样一个文件:
try:f=open(“c:\\temp\\listval.txt”,“r”)try:lines=f.readlines()最后:f.close()除了IOError:pass l=map(chr,range(65,91))num_list=[]for i in line:num_list.append(i.strip().split(','))for num_line in num_list:d=dict(zip(l,num_line))word=“AGP”score=sum(int(d[c])表示word中的c)print score
不完全一样,我也想通过自己的值来分配字母,但其他字母已经加入,谢谢。