Python 计算一百万数据集场景中的平均元组
给定一个包含一百万数据的数据集,我想计算物品的平均价格。一些itemID被复制,这是关键 例如,给定以下词典: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'] .
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:)清除。是的,我正在处理公司数据,并已将数据替换为假数据。非常感谢,你帮了很多忙!非常感谢。你预言了我还将面临什么问题!谢谢