簡體   English   中英

特定數字和四舍五入到兩位小數的總和

[英]Sum of specific numbers and rounding numbers to two decimal places

我試圖在不更改文件本身的情況下從文件中獲取某些數字的總和

1 #person number
Marlon Holmes  #Name
18.86 # First number
13.02 # Second Number
13.36 # Third Number

對於數字的總和,它需要是#First、#second和#third數字

當前數字以厘米為單位,已轉換為英寸,因此需要兩位小數

我目前的代碼是根據#first、#second 和#third 數字的總和提供前3 個人。

當前代碼:

data = []
names = OrderedDict([('Competitor Number', int),
    ('Competitor Name', str),
    ('Cucumber', to_inch),
    ('Carrot', to_inch),
    ('Runner Bean', to_inch)])

with open('veggies_2016.txt') as fobj:
    while True:
        item = {}
        try:
            for name, func in names.items():
                item[name] = func(next(fobj).strip())
            data.append(item)
        except StopIteration:
            break
sorted_data = sorted(data, key=itemgetter('Runner Bean'), reverse = True)
for entry in sorted_data[:3]:
    for key, value in entry.items():
        print value
    print

文件中有大約 50 條記錄可供我讀取,必須將所有記錄相加,然后放入前 3 條記錄,最好保留兩位小數

參考to_inch的代碼:

def to_inch(cm):
    return float(cm) / 2.54

整個文檔圍繞一個主菜單工作

為了得到總和,我試過sum(item.entry.items())但沒有成功,也試過"%.2f"小數/有效數字但沒有成功,任何幫助將不勝感激

如果我們暫時不考慮讀取文件並假設我們可以將數字放入list我們可以使用 Python 的round()sum()map()

代碼:

numbers = [18.86, 13.02, 13.36]

def to_inch(cm):
    return cm/2.54

numbers_in_inches = list(map(to_inch, numbers))
print(numbers_in_inches)

numbers_rounded = list(map(round, numbers_in_inches, [0 for _ in numbers]))
print(numbers_rounded)

sum_numbers = sum(numbers_rounded)
print(sum_numbers)

輸出:

[7.4251968503937, 5.125984251968504, 5.259842519685039]
[7.0, 5.0, 5.0]
17.0

怎么了:

  1. 映射你的函數to_inch上每個項目的列表中的numbers
  2. 將 Python 的round()函數映射到numbers_in_inches每個值, numbers_in_inches進行列表理解的原因是它為map()創建了一個0的列表,用於round(number, places)places
  3. 使用 Python 的sum()來計算所有數字的總和,當然,如果你想在總和之后round(sum_numbers, 0) ,你可以使用round(sum_numbers, 0) 注意:如果您想求和四舍五入,請使用math.fsum而不是像 Copperfield 在評論中提到的sum

現在解析文件:

import re

numbers_names = {}
numbers = []
player_number = ''
name = ''

with open('file.txt', 'r') as f:
    for line in f:
        if '#person number' in line:
            player_number = int(line.split('#')[0])
        elif '#Name' in line:
            name = line.split('#')[0]
        else:
            line_numbers = re.sub(r"[^\d.]", "", line)
            if '.' in line_numbers:
                numbers.append(float(line_numbers))
        if len(numbers) >= 3 and player_number and name:
            numbers_names.update({'player_number': player_number, 'name': name,  'numbers': numbers})
            numbers, player_number, name = [], 0, ''

print(numbers_names)

輸出:

{'name': 'Marlon Holmes  ', 'numbers': [18.86, 13.02, 13.36], 'player_number': 1}

它是如何解析文件的:

  1. 首先打開文件。
  2. Next 遍歷文件中的每一行。
  3. 對於文件中的每一行,它會查看該行是否包含玩家姓名、玩家編號或他擁有的號碼。

    • Player Number 將行拆分到音符中,然后數據獲取數據並將其設置為等於player_number

    • Name 將行拆分到音符中,然后數據獲取數據並將其設置為等於name

    • 他擁有的數字會刪除除.之外的所有非單詞字符. 在文件中使用rere.sub() 然后,檢查清理的行中是否有小數。 最后,如果是這樣,它將該行附加到numbers
  4. 如果所有三個值都存在,它會將它們全部附加到numbers_names字典並為下一個玩家重置變量。

暫無
暫無

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

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