Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python中的自定义比较器函数对2D列表进行排序?_Python_Python 3.x_Sorting_Comparison - Fatal编程技术网

如何使用python中的自定义比较器函数对2D列表进行排序?

如何使用python中的自定义比较器函数对2D列表进行排序?,python,python-3.x,sorting,comparison,Python,Python 3.x,Sorting,Comparison,我试图解决一个问题: 问题是根据第二个元素对列表进行排序。对于任意两个列表,如果第二个元素相同,则根据第一个元素进行排序。 输入如下: 79 4. 夏娃78 鲍勃99 苏西86 爱丽丝86 输出应为: bob99 爱丽丝86 苏西86 这是我编写的Python代码 def compare(item1, item2): if item1[1] == item2[1]: return item1[0] < item2[0] else:

我试图解决一个问题:

问题是根据第二个元素对列表进行排序。对于任意两个列表,如果第二个元素相同,则根据第一个元素进行排序。 输入如下:

79
4.
夏娃78
鲍勃99
苏西86
爱丽丝86
输出应为:

bob99
爱丽丝86
苏西86
这是我编写的Python代码

 def compare(item1, item2):
    if item1[1] == item2[1]:
         return item1[0] < item2[0]
    else:
         return item1[1] < item2[1]

 ts = int(input())
 n = int(input())
 m = []
 for i in range(n):
      l = list(input().split())
      l[1] = int(l[1])
      m.append(l)
 sorted(m, key=compare, reverse=True) # or m.sort(key=compare, reverse=True)

 for i in range(n):
      if m[i][1] >= ts:
          print(m[i][0], m[i][1])
def比较(项目1、项目2):
如果项目1[1]==项目2[1]:
返回item1[0]=ts:
打印(m[i][0],m[i][1])
对于两种排序/排序方法,都有一个错误:

  • 对于排序的

    TypeError:compare()缺少1个必需的位置参数:“item2”

  • 对于
    排序

    TypeError:compare()缺少1个必需的位置参数:“item2”


  • 两种方法的错误相同。

    您混淆了两个概念:键函数和比较函数。虽然它们都可以用作排序的助手,但它们是不同类型的函数

    相关文件的链接:

    • )
    compare
    函数输入两个项目,并返回true或false以判断哪个项目较小。
    函数输入一个项,并返回一个易于与其他项的值进行比较的值。想象一下,如果你在商店里,想按价格对商品进行排序:你需要的
    函数就是返回商品价格的函数

    在这里,您要根据对进行排序
    (项[1],项[0])
    。所以你可以做到:

    unsorted_list=[('Eve',78),('Bob',99),('Suzy',86),('Alice',86)]
    定义_键(项目):
    退货(项目[1],项目[0])
    已排序的\u列表=已排序(未排序的\u列表,键=键)
    
    如果您不打算在以后的代码中重用函数
    的_键
    ,您可能会觉得这有点乏味,并且希望避免使用
    def
    关键字来定义命名函数。在这种情况下,可以使用
    lambda
    而不是
    def
    ,来定义匿名函数:

    unsorted_list=[('Eve',78),('Bob',99),('Suzy',86),('Alice',86)]
    已排序的\u列表=已排序(未排序的\u列表,键=lambda项:(项[1],项[0]))
    
    最后,由于根据列表的某些字段进行排序非常常见,而不是自己用
    def
    lambda
    定义键,因此您可以使用以下预先存在的函数:

    从操作员导入itemgetter
    未排序列表=[('Eve',78),('Bob',99),('Suzy',86),('Alice',86)]
    排序的列表=排序的(未排序的列表,键=itemgetter(1,0))
    
    进一步拟合输入示例 在输入示例中,某些列表似乎只有一个元素,而不是两个。试图引用只有一个元素的列表中的“第二个元素”必然会使python解释器崩溃。您可以定义一个自定义
    函数,该函数分别处理一个元素列表:

    unsorted_list=[79],[4],“答案是',42',但这个列表太长了'],[Eve',78],“Bob',99],“Suzy',86],“Alice',86]]
    定义_键(项目):
    如果长度(项目)>=2:
    退货(项目[1],项目[0])
    其他:
    退货(项目[0],'')
    已排序的\u列表=已排序(未排序的\u列表,键=键)
    #还是和lambda一起
    已排序的\u列表=已排序(未排序的\u列表,键=lambda项:(项[1],项[0]),如果len(项)>=2,则为其他项(项[0],“”))
    

    请注意,如果某些项是空列表,则仍会崩溃。如果可能是这种情况,如果希望将这些空列表保存在排序列表中,则应在键中添加第三个大小写来处理空列表;或者,您可以先使用列表理解或
    过滤器过滤列表,以删除空项。

    您混淆了两个概念:“键”和“比较”。Python标准函数对这两个函数进行了区分。在代码中,您定义了一个“比较”函数,然后将其用作排序的
    的“键”,而这并不是您所期望的工作方式。我将发布一个更详细的答案。From:key指定一个参数的函数,用于从iterable中的每个元素提取比较键。因此,它应该访问应该用于比较的项属性(它将执行
    key\u函数(项)
    对于每个元素,以默认比较方式比较结果。请更正问题并删除前两个元素,因为它们不是要排序的主题。问题应该清楚,无需在某些服务中注册即可阅读整个描述。@astentx谢谢,我添加了一个额外的段落对不起,第一个数字rs不是可排序的输入,它是一些辅助变量,不是(排序)的一部分问题。我必须注册以了解他们希望如何处理这些空命名值,但结果表明它们不是用于排序的。我将在原始问题中添加对此的注释。因此,我删除了我对空命名项的注释,在您使用列表修复元组后,它变得完全不相关