2

我正在尝试获取列表列表中的项目计数,并将这些计数添加到 Python 中的字典中。我已经成功地制作了列表(它是单个广告查看记录的所有可能出现组合的列表)和一个字典,其键等于可能出现的所有值,现在我需要计算每个出现和更改的次数字典中的值到列表列表中对应键的计数。这是我所拥有的:

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

我已经尝试了很多不同的方法来做到这一点,我通常要么得到“太多的值来解包”错误,要么根本没有填充。发布了几个类似的问题,但我对 Python 还很陌生,而且没有一个真正解决了我需要足够接近让我弄清楚的问题。非常感谢。

4

4 回答 4

9

使用 aCounter而不是普通的 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

我有一些类似于该问题的旧代码,它可能对面临类似问题的人有用。

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 回答
0

首先,使用生成器表达式“展平”列表:(item for sublist in combs for item in sublist)

然后,遍历展平列表。对于每个项目,您可以向 dict 添加一个条目(如果它不存在),或者向值添加一个。

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

如果您只想展平列表列表,则可以使用 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 回答