按可变数量的键对多维列表进行排序
我看过这篇帖子,但对我来说并没有用。
补充说明:我说的功能就像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 个回答
这里的关键点(开个玩笑,关键点)是使用一个返回元组的关键函数。下面的关键函数是 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
这段代码会根据第2列和第3列进行排序:
a.sort(key=operator.itemgetter(2,3))
好的,下面是你提供的内容:
这段代码的作用是用来处理一些数据。它会从一个地方获取信息,然后对这些信息进行一些操作,最后把结果输出到另一个地方。简单来说,就是把输入的数据变成我们想要的结果。
在代码中,有一些特定的步骤,比如循环、条件判断等,这些都是为了确保程序能按照我们预期的方式运行。循环就像是重复做一件事情,而条件判断则是根据不同的情况来决定接下来该做什么。
总之,这段代码的目的是为了让计算机能够自动化地完成一些任务,减少我们手动操作的时间和精力。
如果你对代码的具体细节有疑问,可以逐行分析,看看每一部分是如何工作的。
希望这个解释能帮助你更好地理解这段代码的功能!
import operator:
def sortByColumn(bigList, *args)
bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place