首页 > 解决方案 > reduce 方法不适用于另一个字典的值

问题描述

from collections import Counter
from functools import reduce
import numpy as np

genres = ['classic', 'pop', 'classic', 'classic', 'pop']
plays = [500, 600, 150, 800, 2500]  

genre_id = {}
genres = np.array(genres)
for genre in list(set(genres)):
    genre_id[genre] = sorted(list(np.where(genres == genre)[0]),
                            key=lambda x:plays[x],
                            reverse=True)
reduce(lambda x,y : plays[x]+plays[y], genre_id['classic'])

进而,

-----------------------------------------------------------------------
IndexError                            Traceback (most recent call last)
<ipython-input-324-9751de58a6aa> in <module>
----> 1 reduce(lambda x,y : plays[x]+plays[y], genre_id['classic'])

<ipython-input-324-9751de58a6aa> in <lambda>(x, y)
----> 1 reduce(lambda x,y : plays[x]+plays[y], genre_id['classic'])

IndexError: list index out of range

我可以使用 解决这个问题collections.Counter
但我想知道为什么它在使用中不起作用functools.reduce

标签: python

解决方案


您正在使用 访问plays列表x,这是累积值。

在你的第一次迭代之后reduce,这个值为1300。这就是列表索引在第二次迭代中超出范围的原因。

使用这样的代码来查看您的问题:

from collections import Counter
from functools import reduce
import numpy as np

genre_id = {}
genres = ['classic', 'pop', 'classic', 'classic', 'pop']
plays = [500, 600, 150, 800, 2500]

genres = np.array(genres)
for genre in list(set(genres)):
    genre_id[genre] = sorted(list(np.where(genres == genre)[0]), key=lambda x:plays[x], reverse=True)

def reduce_function(x, y):
    print(x)
    print(y)
    return plays[x]+plays[y]

print(genre_id)
print(genre_id['classic'])
print(plays)
result = reduce(lambda x,y : reduce_function(x, y), genre_id['classic'])
print(result)

我有 99% 的把握这是你真正想要做的:

 reduce(lambda x,y : x + plays[y], genre_id['classic'], 0)

请注意我如何为 accumulator 提供初始值,0并且我从不尝试plays使用 accumulator进行访问x


推荐阅读