gpt4 book ai didi

python - 使用相反顺序的两个元组条目对元组列表进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 09:10:05 24 4
gpt4 key购买 nike

希望这会有意义...

我有以下形式的元组列表:

list_of_tuples = [('a', 1), ('b', 3), ('b', 2), ('a', 3)]

期望的输出是

sorted_list_of_tuples = [('a', 1), ('b', 2), ('b', 3), ('a', 3)]

问题是我希望第二个条目增加,第一个条目减少。

import operator as op     
sorted_list_of_tuples = sorted(list_of_tuples, key=op.itemgetter(2, 0))

当然,这会将两个字段排序为递增。我想不出一个可爱的(即几行)方法来做到这一点。有没有人有办法轻松完成这种排序?

我似乎记得您可以使用 _ 在括号内引用列表理解的元素,所以也许这是一个开始的地方?


也许我不清楚:在这种情况下,整数更重要。它的顺序应该在列表中增加。当出现平局时(即,第二个条目相等),我希望“b”出现在“a”之前。

最佳答案

如果您可以用英语描述 key ,只需将其翻译成函数即可。

I want the second entry to be increasing, and the first entry to be decreasing.

所以,关键是:

def make_key(my_tuple):
return my_tuple[1], -my_tuple[0]

当然,除了-在字符串上不是这样工作的,所以你需要一些更高级的东西。

或者,也许不是……虽然每个元组的第一个元素是一个字符串,第二个是一个整数,所以,我们可以只否定键函数,并使用 reverse取消否定它:

def make_key(my_tuple):
return -my_tuple[1], my_tuple[0]

sorted_list_of_tuples = sorted(list_of_tuples, key=make_key, reverse=True)

如果您想节省几次击键:

sorted_list_of_tuples = sorted(list_of_tuples,
key=lambda x: (x[1], x[0]), reverse=True)

这不是唯一适用于此的技巧。例如,因为所有字符串都是 1 个字符的字符串,ord(x) < ord(y)比较 x < y .

但有时您想不出一个简单的技巧 — 但您可以想出一个简单的方法来编写比较函数。如果它更具可读性,就这样做:

def compare_my_tuples(lhs, rhs):        
if rhs[1] > lhs[0]: return 1
elif rhs[1] < lhs[0]: return -1
elif rhs[0] > lhs[0]: return -1
elif rhs[0] < rhs[0]: return 1
else: return 0

sorted_list_of_tuples = sorted(list_of_tuples,
key=functools.cmp_to_key(compare_my_tuples))

或者,当然,您可以将其分为两种,如 steveha 的回答。 (是的,它可能需要两倍的时间……但在大多数应用程序中,这根本不会有任何区别。)

关于python - 使用相反顺序的两个元组条目对元组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16348732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com