特定数字和舍入数字之和到两位小数

时间:2016-03-26 19:51:08

标签: python python-2.7

我试图从文件中获取某些数字的总和而不更改文件本身

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"小数字/有效数字,但没有成功,任何帮助将不胜感激

1 个答案:

答案 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

发生了什么:

  1. 在列表to_inch
  2. 中的每个项目上映射您的函数numbers
  3. 将Python round()函数映射到numbers_in_inches中的每个值上,最后列表理解的推理是它创建了一个0&#39;的列表。用于map() round(number, places) places的{​​{1}}个。
  4. 使用Python sum()来获取所有数字的总和,当然,如果你想在总和之后舍入,你可以使用round(sum_numbers, 0)注意:如果您希望在之后对进行舍入,请在评论中使用Copperfield提及的math.fsum代替sum
  5. 现在解析文件:

    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. 接下来迭代文件中的每一行。
    3. 对于文件中的每一行,它会看到它是否包含玩家的名字,玩家编号或他拥有的数字。

      • 玩家编号拆分注释中的行,数据然后获取数据并将其设置为player_number

      • 名称拆分注释行,数据然后获取数据并将其设置为name

      • 他有的号码它使用.&#39; s re删除文件中除re.sub()以外的所有非字字符。然后,检查清理后的行中是否有小数。最后,如果是这样,它会将该行附加到numbers
    4. 如果存在所有三个值,它会将它们全部附加到numbers_names字典并重置下一个播放器的变量。