2

I'm trying to get a count of items in a list of lists and add those counts to a dictionary in Python. I have successfully made the list (it's a list of all possible combos of occurrences for individual ad viewing records) and a dictionary with keys equal to all the values that could possibly appear, and now I need to count how many times each occur and change the values in the dictionary to the count of their corresponding keys in the list of lists. Here's what I have:

import itertools
stuff=(1,2,3,4)
n=1
combs=list()
while n<=len(stuff):
    combs.append(list(itertools.combinations(stuff,n)))
    n = n+1
viewers=((1,3,4),(1,2,4),(1,4),(1,2),(1,4)) 
recs=list()
h=1
while h<=len(viewers):
    j=1
    while j<=len(viewers[h-1]):
       recs.append(list(itertools.combinations(viewers[h-1],j))) 
       j=j+1
    h=h+1
showcount={}
for list in combs:
    for item in list:
        showcount[item]=0    
for k, v in showcount:
        for item in recs:
            for item in item:
                if item == k:
                    v = v+1

I've tried a bunch of different ways to do this, and I usually either get 'too many values to unpack' errors or it simply doesn't populate. There are several similar questions posted but I'm pretty new to Python and none of them really addressed what I needed close enough for me to figure it out. Many thanks.

4

4 に答える 4

9

Counter物事を数えるために通常のdictの代わりに使用してください:

from collections import Counter

showcount = Counter()
for item in recs:
    showcount.update(item)

あるいは:

from collections import Counter
from itertools import chain

showcount = Counter(chain.from_iterable(recs))

ご覧のとおり、これによりコードが非常に単純になります。

于 2012-10-15T17:07:57.520 に答える
0

リストのリストをフラット化するだけの場合は、itertools.chain()を使用できます。

>>> import itertools
>>> listOfLists = ((1,3,4),(1,2,4),(1,4),(1,2),(1,4)) 
>>> flatList = itertools.chain.from_iterable(listOfLists)

コレクションモジュールのCounterオブジェクトは、おそらく残りの作業を実行します。

>>> from collections import Counter
>>> Counter(flatList)
Counter({1: 5, 4: 4, 2: 2, 3: 1})
于 2012-10-15T17:13:02.417 に答える
0

まず、ジェネレータ式を使用してリストを「フラット化」します(item for sublist in combs for item in sublist)

次に、フラット化されたリストを繰り返し処理します。アイテムごとに、dictにエントリを追加するか(まだ存在しない場合)、値に1つ追加します。

d = {}
for key in (item for sublist in combs for item in sublist):
    try:
        d[key] += 1
    except KeyError:  # I'm not certain that KeyError is the right one, you might get TypeError. You should check this
        d[key] = 1

この手法は、サブリストのすべての要素がハッシュ可能であり、キーとして使用できることを前提としています。

于 2012-10-15T17:08:16.897 に答える
0

私は問題に似た古いコードをいくつか持っています、それは同様の問題に直面している人々に役立つかもしれません。

import sys
file = open(sys.argv[-1], "r").read()
wordictionary={}
for word in file.split():
    if word not in wordictionary:
        wordictionary[word] = 1
    else:
        wordictionary[word] += 1
sortable = [(wordictionary[key], key) for key in wordictionary]
sortable.sort()
sortable.reverse()
for member in sortable: print (member)
于 2015-01-09T22:13:34.043 に答える