2015-09-10 2 views
0

Входное гнездо представляет собой список строк кортежей и мне нужен подсчетпамяти сохранение альтернативы по противодействию кортежей ключей расщепления

  • сколько раз встречается каждая строка кортежа
  • сколько раз один элемент из строки кортежа происходит
  • сколько раз другого элемента строки кортежа происходит

в настоящее время я делаю это так:

>>> from collections import Counter 
>>> data = [('foo','bar'), ('foo', 'bar'), ('foo', 'doo'), ('joo', 'doo'), ('koo', 'lar')] 
>>> datacount = Counter(data) 
>>> datacount 
Counter({('foo', 'bar'): 2, ('joo', 'doo'): 1, ('koo', 'lar'): 1, ('foo', 'doo'): 1}) 
>>> x, y = zip(*datacount.keys()) 
>>> x 
('joo', 'foo', 'koo', 'foo') 
>>> y 
('doo', 'bar', 'lar', 'doo') 
>>> xcount = Counter(x) 
>>> ycount = Counter(y) 
>>> xcount 
Counter({'foo': 2, 'koo': 1, 'joo': 1}) 
>>> ycount 
Counter({'doo': 2, 'bar': 1, 'lar': 1}) 

Но я понимаю, что это занимает три отдельных счетчика. Есть ли альтернатива получению подсчетов и другой структуры данных, которые я могу легко получить в счетах?

+0

Что неэффективно об этом? – yurib

ответ

1

Если вы хотите сохранить предвычисленные счетчик для X, Y и X * Y, то нет никакого способа вокруг сохраняя значение для каждого возможного X, Y и X * Y и текущее решение так же хорошо, как любые.

Если это факт, что вы используете 3 отдельных объекта Counter, которые вас беспокоят, вы можете сохранить все количество в одном Counter, хотя это не уменьшит использование памяти.

Если иметь все заранее и загружено в памяти не является обязательным, вы можете:

  • Keep «указатели» вместо объектов - Если фактические строки очень большие, и вы хотите, чтобы избежать их загрузки в память вы можете назначить идентификатор каждому из них, сохранить подсчеты для идентификаторов и только при необходимости вернуться к строкам.
  • Ленивый загрузки/подсчета - вы могли бы поддерживать отображение каждой строки в кортежах он появляется в на диске, и вычислим рассчитывает на требования лишь загружаются соответствующие кортежи, т.е .:

.

def count(x,y): 
    X = load_tuples(x) 
    Y = load_tuples(y) 
    XY = [t for t in X if t[1] == y] 
    return map(len,[X,Y,XY]) 
Смежные вопросы