Удаление объектов, чей счетчик меньше порога в счетчике.

У меня есть счетчик, объявленный как: main_dict = Counter(), а значения добавляются как main_dict[word] += 1. В конце концов я хочу удалить все элементы с частотой менее 15. Есть ли какая-либо функция в Counters для этого.

Любая помощь была оценена.

Ответ 1

Нет, вам нужно удалить их вручную. Использование itertools.dropwhile() делает это немного проще:

from itertools import dropwhile

for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()):
    del main_dict[key]

Демонстрация:

>>> main_dict
Counter({'baz': 20, 'bar': 15, 'foo': 10})
>>> for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()):
...     del main_dict[key]
... 
>>> main_dict
Counter({'baz': 20, 'bar': 15})

При использовании dropwhile вам нужно только проверить ключи, для которых счетчик равен 15 или более; после этого он откажется от тестирования и просто пройдет через все. Это отлично работает с отсортированным списком most_common(). Если существует много значений ниже 15, это экономит время выполнения для всех этих тестов.

Ответ 2

>>> main_dict = Counter({'apple': 20, 'orange': 14, 'mango': 26, 'banana': 12})
>>> for k in main_dict:
        if main_dict[k] < 15:
            del main_dict[k]


>>> main_dict
Counter({'mango': 26, 'apple': 20})

Ответ 3

Другой метод:

c = Counter({'baz': 20, 'bar': 15, 'foo': 10})
print Counter(el for el in c.elements() if c[el] >= 15)
# Counter({'baz': 20, 'bar': 15})

Ответ 4

Могу ли я предложить другое решение

from collections import Counter
main_dict = Counter({'baz': 20, 'bar': 15, 'foo': 10})  
trsh = 15

main_dict = Counter(dict(filter(lambda x: x[1] >= trsh, main_dict.items())))
print(main_dict)

>>> Counter({'baz': 20, 'bar': 15})

Также у меня такая же проблема, но мне нужно вернуть список всех ключей из счетчика со значениями, превышающими некоторый порог. Для этого

keys_list = map(lambda x: x[0], filter(lambda x: x[1] >= trsh, main_dict.items()))
print(keys_list) 

>>> ['baz', 'bar']