Таким образом, у меня была задача, когда мне была предоставлена строка, содержащая вызовы (продолжительность вызова, номер вызова), и задача заключалась в подсчете общей продолжительности. Были некоторые дополнительные проверки: если продолжительность> 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()))
Проблема в том, что вы находите максимальные значения ваших значений dict внутри цикла for.
>>> 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
. Он будет работать каждый раз.