给定一百万个数据的数据集,我希望计算物品的平均价格。一些itemID被复制,这是关键。
例如,给出以下字典:
res = {
'155': ['3','4','5'],
'222': ['1'],
'345': ['6','8','10']
.
(+ 1 million more lines)
.}
我希望计算每个itemID的平均价格并返回字典。预期的产出将是:
{'155': ['4'],
'222': ['1'],
'345': ['8']
.
.
.}
,其中itemid旁边的整数是平均价格。
我希望在将结果作为字典返回之前解压缩res
列表并计算平均价格。
for x, y in res:
// calculate average and add into new dictionary
然而,终端显示存在问题:
----> 9 for k, l in res:
10 print(k)
11
ValueError: too many values to unpack (expected 2)
我应该迭代100万个数据集来获得平均价格吗?任何帮助都会很棒!
答案 0 :(得分:1)
字典对象的__iter__
属性迭代它的键,因此当你遍历字典时,你正在迭代键,你只需要一个一次性变量。
如果要迭代键和值,则必须遍历项目:
for key, value in res.items:
# do stuff
对于您的任务,您可以使用字典理解来计算价格的平均值:
{key:sum(value)/len(value) for key,value in res.items()}
注意:如果使用python 2.X而不是items()
使用iteritems()
,它返回项目的迭代器,并且在内存使用方面更优化。
另请注意,(1)
不是元组,您需要将其转换为(1,)
才能拒绝获取ValueError
:
>>> res = {
... 155: (3,4,5),
... 222: (1,),
... 345: (6,8,10)}
>>>
>>> {key:sum(value)/len(value) for key,value in res.items()}
{345: 8, 155: 4, 222: 1}
但是,如果无法更改该值,则需要在调用其len()
函数之前检查该值的类型:
{key:sum(value)/len(value) if isinstance(value,tuple) else value for key,value in res.items()}
>>> res = {
... 155: (3,4,5),
... 222: (1),
... 345: (6,8,10)}
>>>
>>> {key:sum(value)/len(value) if isinstance(value,tuple) else value for key,value in res.items()}
{345: 8, 155: 4, 222: 1}
答案 1 :(得分:0)
使用iteritems
for x, y in res.iteritems():
// calculate average and add into new dictionary
如果你像for x, y in res:
这样做,那么只返回键而不是值,因此错误,你正在做x, y = key
所以它会给出错误太多的值来解压缩。而iteritems()
返回(key, value)
元组,因此您需要iteritems()
。对于python3,使用res.items()
而不是res.iteritems()
,这是用于python2。