首页 > 解决方案 > 如果 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 表达式来实现这一点?

谢谢。

标签: pythonarrayspython-3.xalgorithmsorting

解决方案


有两种方法可以做到这一点。

  1. 由于您的数组没有负数,您可以将用户 ID 存储为负数,然后对列表进行降序排序。它会自动按升序获取用户 ID。
  2. 使用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]]

推荐阅读