如何使用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不是可排序的输入,它是一些辅助变量,不是(排序)的一部分问题。我必须注册以了解他们希望如何处理这些空命名值,但结果表明它们不是用于排序的。我将在原始问题中添加对此的注释。因此,我删除了我对空命名项的注释,在您使用列表修复元组后,它变得完全不相关