Сравнение списка счетчиков в Python - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть список счетчиков в python:

[Counter({12.011: 30.0, 15.999: 2.0}),
Counter({12.011: 12.0, 15.999: 2.0}),... Counter({12.011: 40.0, 
15.999: 5.0, 79.904: 5.0})]

Как мне найти счетчик каждого элемента Counter.Счетчик выдаёт мне ошибку неустранимого типа.Другой способ, который я подумал, - это перебирать список во вложенном цикле for, проверяя, равен ли каждый счетчик любому другому счетчику в списке, и соответственно увеличивать словарь.Есть ли лучшее решение?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

В Python <= 3.6 ваша лучшая ставка, вероятно, сравнивает каждую <code>Counter со всеми Counter.

В Python> = 3.7 есть лучший способ.Поскольку Counter является подклассом dict, а dict теперь сохраняет их порядок, можно использовать строковое представление каждого Counter объекта в качестве его хеш-функции.

Это немного странноно это работает:

from collections import Counter

li = [Counter({'a': 1, 'b': 2, 'c': 3}),
      Counter({'a': 1, 'b': 2, 'c': 4}),
      Counter({'a': 1, 'b': 3, 'c': 3}),
      Counter({'a': 1, 'b': 2, 'c': 3})]


Counter.__hash__ = lambda counter: hash(str(counter))

print(Counter(li))
# Counter({Counter({'c': 3, 'b': 2, 'a': 1}): 2,
#          Counter({'c': 4, 'b': 2, 'a': 1}): 1,
#          Counter({'b': 3, 'c': 3, 'a': 1}): 1})
0 голосов
/ 09 декабря 2018

Вы можете преобразовать каждый Счетчик в набор ключей, значений (предметов) Frozenset, а затем использовать его как элементы для передачи в Счетчик (так как Frozenset может быть хэшируемым), например, так:

import random

from collections import Counter

random.seed(42)

counts = [Counter([random.randint(0, 2) for _ in range(10)]) for _ in range(10)]

uniques = {frozenset(e.items()): e for e in counts}

counters_count = Counter(map(lambda e : frozenset(e.items()), counts))

for key, count in counters_count.items():
    print uniques[key], count

Выход

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