Как отсортировать список строк по частоте? - PullRequest
1 голос
/ 01 марта 2020

У меня есть список файлов

example_list = [7.gif, 8.gif, 123.html]

Имеется более 700 тыс. Элементов, и мне нужно отсортировать их по частоте, чтобы увидеть наиболее посещаемый и наименее доступный файл.

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)

Когда я запускаю это, он никогда не компилируется. И я пробовал другие методы, но безрезультатно.

Ответы [ 4 ]

3 голосов
/ 01 марта 2020

Ваш алгоритм излишне квадратичен c времени. Следующее является линейным

from collections import Counter
resl2 = [k for k,v in Counter(resl).items() if v > 500]

Если вам нужно их отсортировать, сделайте что-то вроде

resl2 = [(k,v) for k,v in Counter(resl).items() if v > 500]
resl2.sort(key=lambda kv: kv[1])
resl2 = [k for k,v in resl2]
1 голос
/ 01 марта 2020

Из ваш комментарий :

Мне просто нужно выяснить, какой файл встречается чаще всего.

Итак:

statistics.mode(example_list)

0 голосов
/ 01 марта 2020

Вы можете сделать этот трюк, используя set;)

Здесь у вас есть минимальный пример списка файлов и показывает, когда он появляется 2 раза:

files = ['10.gif', '8.gif', '0.gif', '0.doc', '0.gif', '0.gif', '0.tmp', '0.doc', '0.gif']

file_set = set(files)
files_freq = [0]*len(file_set)

for n,file in enumerate(file_set):
    files_freq[n] = files.count(file)

sorted_list = [f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]
print(sorted_list)

и вывод будет: ['0.gif', '0.doc']

set будет фильтровать список только по уникальным вхождениям каждого файла, а l oop вычислит количество каждого файла.

После , понимание жуткого списка - это трюк !

[f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]

Это создаст список только с файлами, которые появлялись 2 или более раз, тогда часть key заставляет sorted функция для использования первых files_freq из zip(files_freq, file_set) для сортировки и reverse для сортировки списка в порядке убывания, показывая самые высокие частоты до этого.

0 голосов
/ 01 марта 2020

Обратите внимание, что i представляет элемент из массива, а не целое число

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)

Измените его на это.

for i in range(0,len(resl)-1):
    if i > 500:
        resl2.append(resl[i])
print(resl2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...