计算一百万个数据集场景中的平均元组

时间:2016-01-21 07:20:52

标签: python

给定一百万个数据的数据集,我希望计算物品的平均价格。一些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万个数据集来获得平均价格吗?任何帮助都会很棒!

2 个答案:

答案 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。