python - 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
解决方案
您正在使用 访问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
。
推荐阅读
- javascript - 通过使用样式组件单击按钮来切换样式
- postman - 批量响应中未显示内容 ID
- python - 导入 python 模块的问题
- r - 将 gt 表并排或在表格或表格中排列
- android - Android jetpack compose中的按钮长按监听器
- python - airflow subdag xcom_pull 来自父 dag 的任务的数据,一个特定的任务
- javascript - 在 JQuery 上找到了一个很好的代码,但我如何让它无限循环?
- xcode - MacOS 共享扩展:无法使激活类型正常工作
- java - 带有 ReactiveMongoRepository 的 Spring WebFlux:不通过流获取数据库更新
- git - 当我没有本地更改时,为什么 git 说我需要推送我的提交,然后执行 git pull?