У меня есть Counter
(от collections
) и хотел бы отфильтровать набор нежелательных предметов. Результатом должен быть новый счетчик (или, если хотите, сделать это на месте), содержащий только элементы, не соответствующие свойству. Я попытался использовать filter
на Counter
, но тогда результат не является Counter
, а просто list
. Я также попытался вычесть set
нежелательных предметов из этого Counter
, но эта операция не реализована. Вычитание Counter
работает, но у меня нет второго Counter
, и создание его по сути является той же задачей, которую я пытаюсь выполнить.Счетчик с фильтром или вычитанием или аналогичный
Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
→ Counter({4: 6, 5: 5, 3: 4, 6: 3, 2: 2, 1: 1, 7: 1})
Теперь я хочу, чтобы удалить все 2
и 3
значения из этого счетчика, поэтому результат должен быть
Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})
Вот мои подходы:
filter(lambda x: x not in (2, 3), c)
→ [1, 4, 5, 6, 7]
Но я не хочу список.
c - set([ 2, 3 ])
→ TypeError: unsupported operand type(s) for -: 'Counter' and 'set'
можно использовать н который перебирает распакованной список элементов в Counter
как это:
Counter(x for x in c.elements() if x not in (2, 3))
→ Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})
но, очевидно, является неоправданно дорогостоящим для больших количествах.
Единственный (не очень хорошо) решение, которое я нашел еще является STH громоздким, как это:
Counter({ k: v for k, v in c.iteritems() if k not in (2, 3) })
Есть ли что-нибудь лучше, легче, более читаемым я с видом?
Почему нет простого оператора вычитания для реализованного Counter
, который может использоваться с set
?
Не будет фильтровать список и отправить его в Противостоять работу? – sagarchalise
Если вы имеете в виду sth like 'Counter (filter (lambda x: x not in (2, 3), c))' then: no. Фильтр выполняет итерацию по счетчику, что означает, что он выполняет итерацию только по клавишам; суммы забываются в этом процессе. Результат всегда будет иметь значение 1 для каждого оставшегося ключа. – Alfe
Я имею в виду, что вы фильтруете этот список '[1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5 , 4] 'и передать его счетчику. – sagarchalise