如果相邻数组中的x[1]==x[1],则python中数组的子部分数组

如果相邻数组中的x[1]==x[1],则python中数组的子部分数组,python,arrays,python-3.x,algorithm,sorting,Python,Arrays,Python 3.x,Algorithm,Sorting,我正在研究CodeSignal上最受欢迎的作家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 = []

我正在研究CodeSignal上最受欢迎的作家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
不幸的是,上述算法因我在质询文本中发现的一个条件而失败:

如果两个用户具有相同数量的视图,则用户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
  • 使用
    参数,可以使用一个简单的lambda函数,如
  • l=[[1,2],[2,3],[2,1]]
    l、 排序(key=lambda x:(x[1],-x[0]),reverse=True)
    打印(l)#[[2,1]、[2,3]、[1,2]]
    
    使用Abhinav的建议,x[0]值的一个关键参数为负值,我对此进行了研究,得出以下结论:

    res = sorted(returnlist, key=lambda x: (x[1], -x[0]), reverse=True)
    
    这将为x[0]和x[1]值创建反向排序,其中x[1]排序为主要排序,-x[1]值为第一个排序的次要或子排序


    Abhinav的代码是正确的,只是缺少reverse=True参数——主要需要进行反向排序和正常的升序排序,因为子部分是目标,删除reverse参数导致这不再有效。

    这是一个非常密集、复杂的代码。你将很难找到能帮助你的人,因为这很难理解。我建议您花几分钟时间提取一些具有有意义名称的帮助函数,改进变量名称等。您有5个嵌套级别(
    if
    in a
    for
    in a
    for
    elsein`for`in a
    for
    ),这很难遵循,由于它是代码信号,代码被大大缩小了。我真的需要一种方法对最终确定的数组进行子排序——换句话说,让匹配值按照与非匹配值相反的顺序进行排序。我不知道这意味着什么。你应该听从我的建议。看起来很有趣!我会尝试一下,然后再报告。非常感谢@如果这解决了你的目的,考虑把它标记为被接受的答案,你应该把缺少的关键字作为注释而不是答案。无论如何,我已经将其添加到了我的中。对不起,我更改了缺少的关键字,并且使用了排序方法,而不是我的代码最初打算使用的排序方法。因此,这不是提供一个“完全适合您的代码”的答案。这是一个演示如何使用排序函数的通用答案,也是一个帮助您解决问题的答案。