Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每次都有不同的结果_Python - Fatal编程技术网

Python 每次都有不同的结果

Python 每次都有不同的结果,python,Python,所以我有一个任务,给我一个包含呼叫的字符串(呼叫持续时间,呼叫号码),任务是计算总持续时间。 还有一些额外的支票: 如果持续时间>5分钟,则仅计算分钟(150美分/分钟) 对于持续时间最长的电话号码,通话是免费的,所以是0美分 我写了密码,正确答案必须是900。但是当我运行代码时,结果总是不同的。有时是0,有时是900。原因是什么 import re string = ''' 00:01:07,400-234-090\n 00:05:01,701-080-080\n 00:05:00,400-

所以我有一个任务,给我一个包含呼叫的字符串(呼叫持续时间,呼叫号码),任务是计算总持续时间。 还有一些额外的支票: 如果持续时间>5分钟,则仅计算分钟(150美分/分钟) 对于持续时间最长的电话号码,通话是免费的,所以是0美分

我写了密码,正确答案必须是900。但是当我运行代码时,结果总是不同的。有时是0,有时是900。原因是什么

import re

string = '''
00:01:07,400-234-090\n
00:05:01,701-080-080\n
00:05:00,400-234-090\n
'''

pattern = r'(?P<duration>[\d]{2}:[\d]{2}:[\d]{2}),(?P<phone>[\d]{3}-[\d]{3}-[\d]{3})'

duration = {}


for s in string.split('\n'):
    match = re.fullmatch(pattern, s)
    if match:
        hour, minutes, sec = match.group('duration').split(':')
        sec = int(sec)
        minutes = int(minutes)
        hour = int(hour) * (minutes * sec)
        if minutes < 5:
            total = (hour + (minutes * 60) + sec) * 3
            print(s + ' - matched! Total seconds:' + str(total))
            if not match.group('phone') in duration:
                duration[match.group('phone')] = total
            else:
                duration[match.group('phone')] += total
        elif minutes >= 5 and sec == 0:
            total = (minutes * 150)
            print(s + ' - matched! Total seconds:' + str(total))
            if not match.group('phone') in duration:
                duration[match.group('phone')] = total
            else:
                duration[match.group('phone')] += total
        elif minutes >= 5 and sec >= 1:
            total = (minutes * 150) + 150
            print(s + ' - matched! Total seconds:' + str(total))
            if not match.group('phone') in duration:
                duration[match.group('phone')] = total
            else:
                duration[match.group('phone')] += total

for k, v in duration.items():
    if v == max(duration.values()):
        duration[k] = 0
print(sum(duration.values()))
重新导入
字符串=“”
00:01:07400-234-090\n
00:05:01701-080-080\n
00:05:00400-234-090\n
'''
模式=r'(?P[\d]{2}:[\d]{2}:[\d]{2}),(?P[\d]{3}-[\d]{3}-[\d]{3})]
持续时间={}
对于string.split('\n')中的s:
匹配=重新完全匹配(模式,s)
如果匹配:
小时,分钟,秒=match.group('duration')。拆分(':')
秒=整数(秒)
分钟=整数(分钟)
小时=整数(小时)*(分钟*秒)
如果分钟数小于5:
总计=(小时+(分钟*60)+秒)*3
打印(s+'-匹配!总秒数:'+str(总计))
如果持续时间不匹配。组(“电话”):
持续时间[匹配组('phone')]=总计
其他:
持续时间[匹配组('phone')]+=总计
elif分钟数>=5秒=0:
总计=(分钟*150)
打印(s+'-匹配!总秒数:'+str(总计))
如果持续时间不匹配。组(“电话”):
持续时间[匹配组('phone')]=总计
其他:
持续时间[匹配组('phone')]+=总计
elif分钟数>=5秒,秒数>=1秒:
总计=(分钟*150)+150
打印(s+'-匹配!总秒数:'+str(总计))
如果持续时间不匹配。组(“电话”):
持续时间[匹配组('phone')]=总计
其他:
持续时间[匹配组('phone')]+=总计
对于持续时间中的k,v.items():
如果v==max(duration.values()):
持续时间[k]=0
打印(总和(duration.values())

问题在于,您正在for循环中查找dict值的最大值

>>> duration
{'400-234-090': 951, '701-080-080': 900}
>>> 
>>> for k, v in duration.items():
...     if v == max(duration.values()):
...         duration[k] = 0
... 
>>> duration
{'400-234-090': 0, '701-080-080': 0}
>>>
>>> print(sum(duration.values()))
0
只需在循环外计算一次,就可以得到预期的答案

>>> duration 
{'400-234-090': 951, '701-080-080': 900}
>>>
>>> max_val = max(duration.values())
>>> for k, v in duration.items():
...     if v == max_val:
...         duration[k] = 0
... 
>>> print(sum(duration.values()))
900

您会得到随机结果,因为您正在重新计算字典上循环内的最大值:密钥顺序不能保证在不同的运行中保持一致。在循环之前添加
m=max(duration.values())
,并将循环中的if从
if v==max(duration.values())
更改为
if v==m
。它每次都会工作。

无论在哪里运行,每次运行它都会得到相同的结果。有三个“匹配的!”行,分别为201、900、750秒,最终输出为0。@abarnert必须为900,因为两个数字的总数分别为900和950。950是较大的一个,因此它等于0。为什么会这样?它必须是900Ah,您可能正在运行Python版本,其中字典(带有字符串键)具有明确的随机顺序,如3.5,而我正在运行的版本中,字典主要插入顺序为3.7。这就是为什么每次你都得到不同的结果,而我总是得到相同的结果。当你得到900时,基本上纯粹是运气,字符串恰好被散列随机排列成一个顺序,使得
max(duration.values())
zero正好是正确的条目。