我正在尝试在列表列表中获取项目数,并将这些计数添加到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很新,并且没有一个真正解决了我需要的东西,足以让我弄明白。非常感谢。
答案 0 :(得分:7)
使用Counter
代替普通字典计算内容:
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))
正如您所看到的那样,您的代码非常更简单。
答案 1 :(得分: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
此技术假定子列表的所有元素都是可清除的,并且可以用作键。
答案 2 :(得分: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})
答案 3 :(得分: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)