У меня есть такой словарь:
my_dict=collections.OrderedDict([((123, 1), 'qwe'), ((232, 1), 'asd'), ((234, 2), 'zxc'), ((6745, 2), 'aaa'), ((456, 3), 'bbb')])
Комбинация кортежа всегда уникальна, и я хотел бы сохранить порядок вставки и, следовательно, OrderedDict. У меня более ~ 10 тыс. элементов в dict. Как я могу эффективно поддерживать счетчик, который дает количество второго элемента в кортеже? По сути, мне нужно знать количество всякий раз, когда я хочу добавить/удалить элемент в ключе. Прямо сейчас я просто перебираю my_dict
и получаю счетчик каждый раз, но это кажется очень дорогим.
В приведенном выше примере я хочу, чтобы вывод был:
1:2 # As in 1 occurs 2 times
2:2
3:1
Прямо сейчас я делаю следующее:
from collections import OrderedDict, Counter
my_dict = OrderedDict()
my_dict[(123,1)] = 'qwe'
my_dict[(232,1)] = 'asd'
my_dict[(234,2)] = 'zxc'
my_dict[(6745,2)] = 'aaa'
my_dict[(456,3)] = 'bbb'
cnt = []
for item in my_dict.keys():
cnt.append(item[1])
print Counter(cnt)
Я не уверен, что это лучший способ, но есть ли способ переопределить оператор =
и функцию pop
, чтобы он добавлял или вычитал счетчик каждый раз, когда я выполняю эту операцию?
__setitem__
и сохраняющий экземплярыCounter
иOrderedDict
в качестве базовых атрибутов. - person g.d.d.c   schedule 28.08.2014my_dict
присваивается обычномуdict
во второй строке. - person jfs   schedule 28.08.2014collections.Counter(x[1] for x in my_dict.iterkeys())
будет делать то, что делает ваш цикл for - person Padraic Cunningham   schedule 28.08.2014