按可变数量的键对多维列表进行排序

9 投票
4 回答
8233 浏览
提问于 2025-04-15 15:42

我看过这篇帖子,但对我来说并没有用。

补充说明:我说的功能就像Excel里的排序功能……这样说是不是更清楚了

我的情况是这样的,我有一个用制表符分隔的文本文件。里面大约有125,000行,每行有6列(列之间用制表符分开)。我把这个文档拆分成了一个二维列表。

我想写一个通用的函数来对这个二维列表进行排序。基本上,我希望有一个函数,可以传入这个大列表,以及一个或多个我想用来排序的列的索引。显然,我希望第一个传入的索引是主要的排序依据,然后是第二个索引,依此类推。

还是搞不懂吗?

这里有个我想做的例子。

Joel    18  Orange  1
Anna    17  Blue    2
Ryan    18  Green   3
Luke    16  Blue    1
Katy    13  Pink    5
Tyler   22  Blue    6
Bob     22  Blue    10
Garrett 24  Red 7
Ryan    18  Green   8
Leland  18  Yellow  9

假设我把这个列表传给我的神奇函数,像这样:

sortByColumn(bigList, 0)

Anna    17  Blue    2
Bob     22  Blue    10
Garrett 24  Red 7
Joel    18  Orange  1
Katy    13  Pink    5
Leland  18  Yellow  9
Luke    16  Blue    1
Ryan    18  Green   3
Ryan    18  Green   8
Tyler   22  Blue    6

然后……

sortByColumn(bigList, 2, 3)

Luke    16  Blue    1
Anna    17  Blue    2
Tyler   22  Blue    6
Bob     22  Blue    10
Ryan    18  Green   3
Ryan    18  Green   8
Joel    18  Orange  1
Katy    13  Pink    5
Garrett 24  Red 7
Leland  18  Yellow  9

有什么线索吗?

4 个回答

2

这里的关键点(开个玩笑,关键点)是使用一个返回元组的关键函数。下面的关键函数是 lambda x: (x[idx] for idx in args)x 被设置为等于一个列表中的元素,也就是一行数据。这个函数返回的是一组值,而不仅仅是一个值。sort() 方法会先根据列表的第一个元素进行排序,如果有相同的情况,就会用第二个元素来决定顺序,以此类推。想了解更多,可以查看这个链接:http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

#!/usr/bin/env python
import csv
def sortByColumn(aList,*args):
    aList.sort(key=lambda x: (x[idx] for idx in args))
    return aList

filename='file.txt'
def convert_ints(astr):
    try:
        return int(astr)
    except ValueError:
        return astr    
biglist=[[convert_ints(elt) for elt in line]
         for line in csv.reader(open(filename,'r'),delimiter='\t')]

for row in sortByColumn(biglist,0):
    print row

for row in sortByColumn(biglist,2,3):
    print row
8

这段代码会根据第2列和第3列进行排序:

a.sort(key=operator.itemgetter(2,3))
11

好的,下面是你提供的内容:

这段代码的作用是用来处理一些数据。它会从一个地方获取信息,然后对这些信息进行一些操作,最后把结果输出到另一个地方。简单来说,就是把输入的数据变成我们想要的结果。

在代码中,有一些特定的步骤,比如循环、条件判断等,这些都是为了确保程序能按照我们预期的方式运行。循环就像是重复做一件事情,而条件判断则是根据不同的情况来决定接下来该做什么。

总之,这段代码的目的是为了让计算机能够自动化地完成一些任务,减少我们手动操作的时间和精力。

如果你对代码的具体细节有疑问,可以逐行分析,看看每一部分是如何工作的。

希望这个解释能帮助你更好地理解这段代码的功能!

import operator:
def sortByColumn(bigList, *args)
    bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place

撰写回答