簡體   English   中英

Python:使用dict中的值對每一行求和

[英]Python: Sum each lines with their values from dict

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

現在我想用dict中的每個值與它們的值相加。

例如:

AB = 181.07884
HHFB = 531.4590000000001

等等。

我不知道如何開始。 非常感謝您的所有答案。

試着簡化一些事情......

鑒於你已經有一個字符串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)

你已經完成了大部分的工作! 你錯過的就是每個子串的總和。

由於子字符串可以更頻繁地出現,我只進行一次求和,並存儲dict中遇到的每個子字符串的值(以及上面的字母表中為了避免關鍵字混淆而重命名為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)

這給了我一個輸出

{
'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}

打開你的文件,然后閱讀每個字符,然后找到字典上的字符並將值添加到總數中。

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

print(sum_)

你可以在dict理解中使用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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM