如何在 Python 中按每个元组的某个索引的整数值对元组列表进行排序?

How to order a list of tuples by the integer value of a certain index of each, in Python?

给定一个元组列表,例如

[('a','b','4'),('c','d','9'),('e','f','2')]

每个元组的第三个元素总是整数的字符串值。

我想使用 csv.writerow() 将每个元组写为 csv 的一行。 在我这样做之前,我想重新排序元组(最好是通过覆盖现有列表或创建一个新列表),以便它们以 降序 的第三个元素的整数值写入每个例如

c,d,9
a,b,4
e,f,2

我正在尝试想象列表理解中的某种多重 if/else 组合,但肯定会有更简单的方法吗?

这适用于 Python 2 和 Python 3:

x = [('a','b','4'),('c','d','9'),('e','f','2')]
x.sort(key=lambda int(x:x[2]), reverse=True)

key是应用于列表中每一项的函数,returns是用作排序依据的键。

sorted 函数(或 list 方法 sort)采用可选参数 reverse 允许您按降序排序,key允许您指定排序依据。

l = [('a','b','4'),('c','d','9'),('e','f','2')]
l.sort(key=lambda x: int(x[2]), reverse=True)

按照您想要的顺序为您提供列表。

在我的回答中,我使用 sys.stdout 作为示例,但您可以改用文件

>>> import sys, csv
>>> items = [('a','b','4'),('c','d','9'),('e','f','2')]
>>> w = csv.writer(sys.stdout)
>>> w.writerows(sorted(items, key=lambda x: int(x[2]), reverse=True))
c,d,9
a,b,4
e,f,2

另一个使用 itemgetterlambda x: x[2] 小列表快一点,大列表快得多。

from operator import itemgetter
l = [('a','b','4'),('c','d','9'),('e','f','2')]
l.sort(key=itemgetter(2), revese=True)

Python sorting mini Howto 有很多有用的技巧值得一读。

略有不同,但效率较低的解决方案:

def sort_tuple_list(l):
    sorted_ints = sorted([int(i[2]) for i in l], reverse=True)
    sorted_tuple_list = []
    for i in sorted_ints:
        for tup in l:
            if int(tup[2]) == i:
                sorted_tuple_list.append(tup)
    return sorted_tuple_list

Returns 根据原始问题的规格排序的列表。 然后您可以简单地将此返回列表的每一行写入您的 csv 文件。