Счетчик частоты сортирует список до того, как я его изменяю, когда он должен сортировать после того, как он меняется - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть счетчик частоты, чтобы просмотреть список раз и сказать, как часто появляется каждое число.Сначала я запускаю функцию удаления десятичных знаков, используя int().Я проверяю это с оператором печати внизу, он работает нормально.Но по какой-то причине, хотя частота возникает после того, как я изменил значения с int().Вот мой код, и я приведу некоторый вывод.

from itertools import groupby
times = [1.23, 1.23, 2.56, 1.23, 1.23, 1.23, 1.23, 1.5, 4.32, 5.3, 2.5, 5.7, 3.4, 8.9, 8.9, 8.9]
newtimes = []
lentimes = len(times)


for time in times:
  #Rounds down every time
  time = int(time)
  #Adds time to new list
  newtimes.append(time)

setTimes = list(set(newtimes))


freqlist = [len(list(group)) for key, group in groupby(newtimes)]

print(newtimes)
print(lentimes)
print(setTimes)
print("Freqlist is " + str(freqlist))

вывод выглядит примерно так:

[1, 1, 2, 1, 1, 1, 1, 1, 4, 5, 2, 5, 3, 8, 8, 8]
16
[1, 2, 3, 4, 5, 8]
Freqlist is [2, 1, 5, 1, 1, 1, 1, 1, 3]

Потребовалось некоторое время, чтобы выяснить, что случилось с выводом freqlist, он делает все правильно, но он делает времена, а не новые времена (где мы отбрасываем десятичные дроби), даже если это должно быть после того, как мы отбрасываем десятичные дроби.Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Проблема в том, что itertools.groupby работает только для последовательных похожих элементов .Требуется отсортированный ввод , чтобы работать так, как вы ожидаете.Вам также не нужно создавать промежуточные списки;вместо этого вы можете использовать sum с выражением генератора:

freqlist = [sum(1 for _ in group) for key, group in groupby(sorted(newtimes))]

Сортировка занимает время O ( n log n ).Для решения O ( n ) вы можете использовать collections.Counter:

from collections import Counter

d = Counter(map(int, times))

Counter({1: 7, 2: 2, 4: 1, 5: 2, 3: 1, 8: 3})

Затем, если хотите, извлечь значения из списка после сортировки поключ:

keys, values = zip(*sorted(d.items()))

print(values)

(7, 2, 1, 1, 2, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...