Разный результат каждый раз

1

Таким образом, у меня была задача, когда мне была предоставлена строка, содержащая вызовы (продолжительность вызова, номер вызова), и задача заключалась в подсчете общей продолжительности. Были некоторые дополнительные проверки: если продолжительность> 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()))
  • 0
    Я получаю один и тот же результат каждый раз, когда запускаю это, независимо от того, где я его запускаю. Есть три "совпавших!" линии с 201, 900, 750 секунд, а конечный результат равен 0.
  • 0
    @abarnert это должно быть 900, потому что общее количество из 2 чисел равно 900 и 950. 950 больше, поэтому оно равно 0. Почему это так? Должно быть 900
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Проблема в том, что вы находите максимальные значения ваших значений 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
1

Вы получаете случайные результаты, потому что вы пересчитываете максимум внутри цикла в словаре: порядок ключей не гарантированно согласован в разных прогонах. Добавьте m = max(duration.values()) перед циклом и измените if, если в цикле, if v == max(duration.values()) if v == m. Он будет работать каждый раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню