python - 如果 x[1] == x[1] 在相邻数组中,则对 python 中的数组数组进行子排序
问题描述
我正在处理 CodeSignal 上的 mostViewedWriters Quora 挑战。
给定 3 个输入,我们需要根据哪个用户对一系列主题的查看次数最多进行排序。
这是我的算法:
def mostViewedWriters(topicIds, answerIds, views):
finallist = []
for x in enumerate(sorted(list(set(i for j in topicIds for i in j)))):
returnlist = []
for x in [q for p, q in enumerate(views) if q[0] in sorted([item for sublist in [z for q, z in enumerate(answerIds) if q in [i for i , y in enumerate(topicIds) if x[1] in y]] for item in sublist])]:
sbl = [y for p, y in returnlist if p == x[1]]
if not sbl:
returnlist.append([x[1], x[2]])
else:
for idx, item in enumerate(returnlist):
if item[0] == x[1]:
added = item[1] + x[2]
returnlist[idx] = [x[1], added]
res = sorted(returnlist, key=lambda x: x[1], reverse=True)
finallist.append(res)
return finallist
不幸的是,上述算法因我在挑战文本中发现的一种情况而失败:
如果两个用户的查看次数相同,则 user_id 较小的用户应该排在第一位。
因此,例如,我附加到 finallist 对象的 2D 列表之一如下所示:
[[3,3],[2,3],[1,1]]
由于该值与前两个列表相关,因此我需要交换这两个列表。如果有 3 个这样的:
[[3,3],[1,3],[2,3],[1,1]]
他们需要重新排序:
[[3,3],[2,3],[1,3],[1,1]]
x[1] 值首先排序,然后 x[0] 值按倒序排序,x[0] 是降序排序,x[1] 是升序排序。
每次 x[1] 值出现平局时,如何运行子排序?有没有办法在我的算法结束时更新我的排序函数上的 lambda 表达式来实现这一点?
谢谢。
解决方案
有两种方法可以做到这一点。
- 由于您的数组没有负数,您可以将用户 ID 存储为负数,然后对列表进行降序排序。它会自动按升序获取用户 ID。
- 使用
key
参数,您可以使用简单的 lambda 函数,例如
l = [[1,2],[2,3],[2,1]]
l.sort(key=lambda x: (x[1], -x[0]), reverse=True)
print(l) #[[2, 1], [2, 3], [1, 2]]
推荐阅读
- c++ - 如何将对象写入文件,并在 C++ 中从中读取?
- laravel - 如何构建多个仪表板?
- c++ - 在 CWinApp 中 m_pMainWnd 为 NULL,因为未调用 InitInstance
- c++ - 如果范围没有排序,inplace_merge 会做什么?
- c++ - 未定义的参考在 arm chromebook 上编译 taskwarrior
- json - 在Angular中使用httpclient服务加载本地json异步
- javascript - 在 VueJS 中将组件作为道具传递时出现未知的自定义元素错误
- angular - 构建后如何使用href修复离子路由?
- c++ - 输出混乱
- javascript - 悬停在带有 textarea 的 div 元素上不起作用