Python 特定数字和四舍五入数字之和,小数点后两位

Python 特定数字和四舍五入数字之和,小数点后两位,python,python-2.7,Python,Python 2.7,我试图在不改变文件本身的情况下从文件中获取某些数字的总和 1 #person number Marlon Holmes #Name 18.86 # First number 13.02 # Second Number 13.36 # Third Number 对于数字之和,它必须是第一、第二和第三个数字 当前的数字以厘米为单位,已转换为英寸,小数点后两位是必要的 我目前的代码是根据第一、第二和第三个数字的总和提供前三名 当前代码: data = [] names = OrderedDict(

我试图在不改变文件本身的情况下从文件中获取某些数字的总和

1 #person number
Marlon Holmes  #Name
18.86 # First number
13.02 # Second Number
13.36 # Third Number
对于数字之和,它必须是第一、第二和第三个数字

当前的数字以厘米为单位,已转换为英寸,小数点后两位是必要的

我目前的代码是根据第一、第二和第三个数字的总和提供前三名

当前代码:

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位,最好是小数点后两位

表示_英寸的代码:

def to_inch(cm):
    return float(cm) / 2.54
整个文档围绕主菜单工作


为了得到总和,我尝试了
sum(item.entry.items())
,但没有成功,也尝试了
“%.2f”
十进制数字/有效数字,但没有成功,如果我们现在不考虑从文件中读取数据,并且假设我们可以将数字放入
列表中,我们可以使用Python的,那么任何帮助都将不胜感激

代码:

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
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}
输出:

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
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}
发生了什么:

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
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}
  • 将您的功能
    映射到列表中每个项目的\u inch
  • 将Python的
    round()
    函数映射到
    numbers\u in.
    中的每个值上,最后理解列表的理由是它为
    map()
    创建了一个
    0
    的列表,用于
    round(number,places)
    位置
  • 使用Python的
    sum()
    对所有数字求和,当然,如果要在求和后进行取整,可以使用
    round(sum\u numbers,0)
    。注意:如果您想在求和之后对进行取整,请使用
    math.fsum
    而不是科波菲尔在评论中提到的
    sum
  • 现在分析文件:

    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
    
    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}
    
    输出:

    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
    
    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}
    
    解析文件的方式:

    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
    
    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\u Number

    • Name将行拆分为注释,然后数据获取数据并将其设置为等于
      Name

    • 他拥有的数字它使用
      re
      re.sub()
      删除文件中除
      以外的所有非单词字符。然后,检查清理后的行中是否有小数点。最后,如果是这样,它会将该行附加到
      numbers
  • 如果这三个值都存在,它会将它们全部附加到
    numbers\u names
    字典中,并为下一个播放器重置变量


  • 顺便说一句,它是
    “%.2f”
    。我如何让它与来自该文件的所有数字一起工作?解析该文件并将所有数字放入名为
    数字的列表中Updated@NeilHouston您可以将成圆部分添加到
    到_inch
    中,如下所示:
    返回圆(浮动(cm)/2.54,2)
    如果您想要2位小数,或者想要最小化浮点舍入问题的任何其他数字,则可以使用2代替总和