【问题标题】:How to order a list of tuples by the integer value of a certain index of each, in Python?如何在 Python 中通过每个元组的某个索引的整数值对元组列表进行排序?
【发布时间】:2015-09-14 15:47:24
【问题描述】:

给定一个元组列表,例如

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

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

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

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

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

【问题讨论】:

  • (如果 csv 只包含一个元组列表,那么显然我可以在 csv 本身中重新排序,例如在 Excel 中。但是 CSV 将包含许多这样的元组列表,一个在另一个之后。

标签: python list python-2.7 tuples list-comprehension


【解决方案1】:

这适用于 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 是一个应用于列表中每个项目的函数,并返回用作排序依据的键。

【讨论】:

  • 比较排序在 Python 3 中被移除并且你没有指定cmp=
  • @jamylak:好点。编辑了我的示例以使用适用于 Python 2 和 Python 3 的技术。“cmp”函数是一个通用比较函数,它返回 -1、0、1 以显示任何两个值的小于、等于或大于.
  • 实际上,是的,但实际上"help(cmp) Return negative if x<y, zero if x==y, positive if x>y." 所以它是消极的和积极的,并不总是-11
【解决方案2】:

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)

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

【讨论】:

  • key=lambda x: -int(x[2]) 不需要reverse=True 就可以做到。
  • @kindall 我想这只是个人喜好,因为reverse 对我来说似乎更清楚
【解决方案3】:

在我的回答中,我以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

【讨论】:

  • 这是我不明白为什么人们如此喜欢itemgetter 的主要原因之一——你的排序是字典顺序的,而不是整数值。
  • @DSM 我的错误,我没有注意到它是一个字符串。现已修复
【解决方案4】:

另一个使用itemgetter 的速度比lambda 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 有很多有用的技巧值得一读。

【讨论】:

    【解决方案5】:

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2018-03-09
      • 2014-07-18
      • 1970-01-01
      • 2020-07-20
      相关资源
      最近更新 更多