Python3列表:如何根据数字和字母进行排序[(';NJ';81),(';CA';81),(';DC';52)]?

Python3列表:如何根据数字和字母进行排序[(';NJ';81),(';CA';81),(';DC';52)]?,python,list,sorting,python-3.x,Python,List,Sorting,Python 3.x,如果我的名单是 [('IL',36),('NJ',81),('CA',81),('DC',52),('TX',39)], 我怎样才能对它进行排序,使我的结果 [('CA',81),('NJ',81),('DC',52),('TX',39),('IL',36)]?如果第一个元素不相等,比较第一个元素;如果相等,比较第二个元素。如果您想按相反的顺序,请将cmp(a,b)切换为cmp(b,a) 另一个答案较短,但即使其中一个元素不是数字,并且可以扩展到任意级别,这种方法仍然有效,尽管您可能希望编写适当

如果我的名单是
[('IL',36),('NJ',81),('CA',81),('DC',52),('TX',39)]
,

我怎样才能对它进行排序,使我的结果
[('CA',81),('NJ',81),('DC',52),('TX',39),('IL',36)]

如果第一个元素不相等,比较第一个元素;如果相等,比较第二个元素。如果您想按相反的顺序,请将
cmp(a,b)
切换为
cmp(b,a)

另一个答案较短,但即使其中一个元素不是数字,并且可以扩展到任意级别,这种方法仍然有效,尽管您可能希望编写适当的比较函数,而不是使用lambda-进行一般N级别排序:

>>> def arbitrary_level_tuple_sort(iterable, order=[(0, 'a')]):
        def comparator(a, b):
            for i, o in order:
                if a[i] != b[i]:
                    if o == 'a':
                        return cmp(a[i], b[i])
                    else:
                        return cmp(b[i], a[i])
            return 0
        return sorted(iterable, cmp=comparator)

>>> arbitrary_level_tuple_sort(a, [(1, 'd'), (0, 'a')])
[('CA', 81), ('NJ', 81), ('NJ', 81), ('TX', 39), ('IL', 36)]
order
参数是元组索引和顺序的列表(a=升序/d=降序),适用于任何大小的元组:

>>> b = [tuple([random.randint(0, 10) for i in range(5)]) for i in range(5)]
>>> b
[(7, 5, 5, 8, 0),
 (0, 4, 5, 0, 7),
 (7, 4, 0, 9, 0),
 (1, 1, 3, 9, 4),
 (6, 2, 9, 6, 3)]
按第4个元素(索引3)降序排序,然后按第5个元素和第一个元素升序排序:

>>> arbitrary_level_tuple_sort(b, [(3, 'd'), (4, 'a'), (0, 'a')])
[(7, 4, 0, 9, 0),
 (1, 1, 3, 9, 4),
 (7, 5, 5, 8, 0),
 (6, 2, 9, 6, 3),
 (0, 4, 5, 0, 7)]

直截了当地说:

your_list.sort(key=lambda e: (-e[1], e[0]))
比如说

>>> your_list = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)]
>>> your_list.sort(key=lambda e: (-e[1], e[0]))
>>> your_list
[('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)]
请注意,上面对列表进行了适当的排序。如果要将其包装到函数中而不修改原始列表,请使用
sorted

def your_sort(your_list):
    return sorted(your_list, key=lambda e: (-e[1], e[0]))

如果您不能方便地
-somefield
,那么Pythonic方法将是利用Python的排序稳定性进行多阶段排序

a = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)]

from operator import itemgetter
a.sort(key=itemgetter(0))
a.sort(key=itemgetter(1), reverse=True)
# [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)]
.. 或者“如何对2元组列表进行排序,从第二个元素开始降序,然后从第一个元素开始升序?”
a = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)]

from operator import itemgetter
a.sort(key=itemgetter(0))
a.sort(key=itemgetter(1), reverse=True)
# [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)]