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

Python 计算一百万数据集场景中的平均元组,python,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 = {
   '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)

我应该迭代一百万个数据集来得到平均价格吗?任何帮助都会很好

使用
iteritems

for x, y in res.iteritems():
    // calculate average and add into new dictionary

如果在res:中对x,y执行
操作,则只返回键,而不返回值,因此出现错误,您执行的是
x,y=key
,因此会给错误提供太多的值,无法解包。而
iteritems()
返回
(键,值)
元组,因此需要
iteritems()
。对于python3,使用
res.items()
而不是python2使用的
res.iteritems()

字典对象的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性会在其键上迭代,因此,当您在字典上迭代时,您正在迭代键,您只需要一个throwaway变量

如果要迭代键和值,则必须迭代项:

for key, value in res.items:
      # do stuff
对于您的任务,您可以使用字典理解来计算平均价格:

{key:sum(value)/len(value) for key,value in res.items()}
注意:如果使用Python2.X而不是
items()
则使用
iteritems()
,它返回项目的迭代器,并且在内存使用方面更优化

还要注意,
(1)
不是元组,您需要将其转换为
(1,)
,以拒绝获取
值错误

>>> 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}

(6+8+10)/3
是8。你能解释一下
345:10
?你确定你得到了那个特定的
ValueError
?我只在将这些整数键更改为字符串时才得到它。这实际上不会引发
ValueError
。编辑问题并在代码中使用词典时提供词典。歧义对任何人都没有帮助。dict键可能是长度超过2个字符的字符串:
>>对于k,v在{'abc':1}:
中引发相同的异常:
ValueError:太多的值无法解包(预期为2)
您好,我为歧义感到抱歉。我按要求做了编辑,希望以后能对别人有所帮助。谢谢所有帮忙的人!请注意,给定的错误消息与给定的代码不匹配。@TigerhawkT3您是对的。对于int对象,它应该是
TypeError
。但是可能是OP,而不是从他的原始代码复制值,在这里输入新值。因此,他可能在原始代码中使用了字符串,因此出现了
ValueError
。只能通过OP:)清除。是的,我正在处理公司数据,并已将数据替换为假数据。非常感谢,你帮了很多忙!非常感谢。你预言了我还将面临什么问题!谢谢