[英]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
怎么了:
to_inch
上每個項目的列表中的numbers
round()
函數映射到numbers_in_inches
每個值, numbers_in_inches
進行列表理解的原因是它為map()
創建了一個0
的列表,用於round(number, places)
的places
。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}
它是如何解析文件的:
對於文件中的每一行,它會查看該行是否包含玩家姓名、玩家編號或他擁有的號碼。
Player Number 將行拆分到音符中,然后數據獲取數據並將其設置為等於player_number
。
Name 將行拆分到音符中,然后數據獲取數據並將其設置為等於name
.
之外的所有非單詞字符.
在文件中使用re
的re.sub()
。 然后,檢查清理的行中是否有小數。 最后,如果是這樣,它將該行附加到numbers
。 如果所有三個值都存在,它會將它們全部附加到numbers_names
字典並為下一個玩家重置變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.