Python:使用字典中的值对每行进行求和

3
dict = {'A': 71.07884,
    'B': 110,
    'C': 103.14484,
    'D': 115.08864,
    'E': 129.11552,
    'F': 147.1766,
    'G': 57.05196,
    'H': 137.1412
    }


def search_replace(search, replacement, searchstring):
    p = re.compile(search)
    searchstring = p.sub(replacement, searchstring)
    return (searchstring)


def main():
    with open(sys.argv[1]) as filetoread:
    lines = filetoread.readlines()
    file = ""

    for i in range(len(lines)):
        file += lines[i]

    file = search_replace('(?<=[BC])', ' ', file)

    letterlist = re.split('\s+', file)

    for j in range(len(letterlist)):
        print(letterlist[j])

if __name__ == '__main__':
    import sys
    import re
    main()

我的程序打开一个文件,然后将B或C之后的字母文本拆分。

文件的格式如下:

ABHHFBFEACEGDGDACBGHFEDDCAFEBHGFEBCFHHHGBAHGBCAFEEAABCHHGFEEEAEAGHHCF

现在我想要将每行与字典中的值相加。
例如:
AB = 181.07884
HHFB = 531.4590000000001

诸如此类。

我不知道该如何入手。非常感谢你们提供的所有答案。

4个回答

1

尝试简化事情...

假设您已经有一个字符串s和一个字典d

ctr = 0
temp = ''
for letter in s:
    ctr += d[letter]
    temp += letter
    if letter in 'BC':
        print(temp, ctr)
        ctr = 0
        temp = ''

在您提供的情况下,其中包括:
s = "ABHHFBFEACEGDGDACBGHFEDDCAFEBHGFEBCFHHHGBAHGBCAFEEAABCHHGFEEEAEAGHHCF"
d = {'A': 71.07884,
'B': 110,
'C': 103.14484,
'D': 115.08864,
'E': 129.11552,
'F': 147.1766,
'G': 57.05196,
'H': 137.1412
}

你会在终端上看到结果:
>>> ('AB', 181.07884)
('HHFB', 531.4590000000001)
('FEAC', 450.5158)
('EGDGDAC', 647.6204)
('B', 110)
('GHFEDDC', 803.8074)
('AFEB', 457.37096)
('HGFEB', 580.4852800000001)
('C', 103.14484)
('FHHHGB', 725.6521600000001)
('AHGB', 375.272)
('C', 103.14484)
('AFEEAAB', 728.64416)
('C', 103.14484)
('HHGFEEEAEAGHHC', 1571.6099199999999)

1

你已经完成了大部分工作!你需要做的只是计算每个子字符串的总和。

由于子字符串可能会出现多次,我将仅进行一次求和,并将遇到的每个子字符串的值存储在字典中(我将上面关于字母和值之间关系的字典重命名为mydict,以避免关键字混淆):

snippets = {}
for snippet in letterlist:
    if snippet not in snippets:
        value = 0
        for s in snippet:
            value += mydict.get(s)
        snippets[snippet] = value
print(snippets)

That gives me an output of

{
'AB': 181.07884, 
'HHFB': 531.4590000000001, 
'FEAC': 450.5158, 
'EGDGDAC': 647.6204, 
'B': 110, 
'GHFEDDC': 803.8074, 
'AFEB': 457.37096, 
'HGFEB': 580.4852800000001, 
'C': 103.14484, 
'FHHHGB': 725.6521600000001, 
'AHGB': 375.272, 
'AFEEAAB': 728.64416, 
'HHGFEEEAEAGHHC': 1571.6099199999999, 
'F': 147.1766}

请问您能告诉我如何仅获取500到1000之间的代码片段吗? - BerTu
仅过滤输出...例如 print([(k,v) for (k,v) in snippets.items() if v > 500 and v < 1000]) - planetmaker
我明白了。非常感谢!! :) - BerTu

1

打开您的文件,然后逐个读取每个字符,再在字典中查找该字符并将其值加到您的总和中。

sum_ = 0
letters = "letters_file"
opened = open(letters, "r")
for row in opened:
    for char in row:
        sum_ += int(your_dictionary[char])

print(sum_)

1

您可以在字典推导式中使用re.splititertools.zip_longest

import re
from itertools import zip_longest
i = iter(re.split('([BC])', s))
{w: sum(d[c] for c in w)for p in zip_longest(i, i, fillvalue='') for w in (''.join(p),)}

这将返回:

{'AB': 181.07884, 'HHFB': 531.4590000000001, 'FEAC': 450.5158, 'EGDGDAC': 647.6204, 'B': 110, 'GHFEDDC': 803.8074, 'AFEB': 457.37096, 'HGFEB': 580.4852800000001, 'C': 103.14484, 'FHHHGB': 725.6521600000001, 'AHGB': 375.272, 'AFEEAAB': 728.64416, 'HHGFEEEAEAGHHC': 1571.6099199999999, 'F': 147.1766}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接