我试图从文件中获取某些数字的总和而不更改文件本身
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"
小数字/有效数字,但没有成功,任何帮助将不胜感激
答案 0 :(得分:2)
如果我们暂时忽略对该文件的阅读并假设我们可以将这些数字放在list
中,我们可以使用Python round()
,sum()
和{{3 }}
<强>代码:强>
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
中的每个值上,最后列表理解的推理是它创建了一个0
&#39;的列表。用于map()
round(number, places)
places
的{{1}}个。sum()
来获取所有数字的总和,当然,如果你想在总和之后舍入,你可以使用round(sum_numbers, 0)
。 注意:如果您希望在之后对进行舍入,请在评论中使用Copperfield提及的math.fsum
代替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
。
名称拆分注释行,数据然后获取数据并将其设置为name
.
&#39; s re
删除文件中除re.sub()
以外的所有非字字符。然后,检查清理后的行中是否有小数。最后,如果是这样,它会将该行附加到numbers
。如果存在所有三个值,它会将它们全部附加到numbers_names
字典并重置下一个播放器的变量。