Удаление объектов, чей счетчик меньше порога в счетчике.
У меня есть счетчик, объявленный как: 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']