如何在Android Studio中通过Chaquopy接收Python返回的对象类型数据
问题根源与修复方案
1 切片范围错误
Python列表切片为左闭右开规则,你当前代码写的sim_scores = sim_scores[1:5]只会取排序后第2到第5位共4个结果,若要返回5部推荐电影,需要将切片修改为:
sim_scores = sim_scores[1:6]
2 返回值类型适配问题
你当前Python函数返回的是pandas Series对象,Chaquopy对pandas自定义对象的序列化支持不完善,直接调用toString()会出现内容截断,仅显示第一条数据。你需要将返回值转换为Python原生列表,修改Python函数的返回逻辑:
# 原返回代码 # return recommendation # 修改为 return recommendation.values.tolist()
3 Android侧代码适配
不要直接对返回的PyObject调用toString,改为遍历列表元素拼接成展示文本,修改Java点击逻辑:
bttn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PyObject pyo = pyobj.getModule("main"); PyObject obj = pyo.callAttr("get_recomendations",IN1.getText().toString()); StringBuilder resultBuilder = new StringBuilder(); // 遍历Python返回的列表所有元素 for (int i = 0; i < obj.len(); i++) { resultBuilder.append(i+1) .append(". ") .append(obj.get(i).toString()) .append("\n"); } textView.setText(resultBuilder.toString()); } });
可选验证步骤
你可以在Python函数中加入打印逻辑,确认Python侧返回的推荐结果数量符合预期,排除推荐算法本身计算结果不足的问题:
def get_recomendations(title, cosine_sim=cosine_sim): idx = indices[title] sim_scores = list(enumerate(cosine_sim[idx])) sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True) sim_scores = sim_scores[1:6] movie_indices = [i[0] for i in sim_scores] recommendation = df2['title_x'].iloc[movie_indices] # 调试打印,可在Logcat中查看输出 print("推荐结果数量:", len(recommendation)) return recommendation.values.tolist()
内容的提问来源于stack exchange,提问作者Muhammad Hanif bin Samsudin
相关产品推荐
相关产品推荐

