Python 按不同的键数对多维列表进行排序
我读过书,但没有为我工作 编辑:我描述的功能就像Excel中的排序功能。。。如果这更清楚的话 这是我的情况,我有一个以制表符分隔的文本文档。大约有125000行,每行6列(列由制表符分隔)。我已将文档拆分为二维列表 我正在尝试编写一个通用函数来对二维列表进行排序。基本上,我希望有一个函数,我可以传递大列表,以及一个或多个列的键,我希望对大列表进行排序。显然,我希望传递的第一个键是主排序点,然后是第二个键,以此类推 还困惑吗 下面是我想做的一个例子Python 按不同的键数对多维列表进行排序,python,sorting,Python,Sorting,我读过书,但没有为我工作 编辑:我描述的功能就像Excel中的排序功能。。。如果这更清楚的话 这是我的情况,我有一个以制表符分隔的文本文档。大约有125000行,每行6列(列由制表符分隔)。我已将文档拆分为二维列表 我正在尝试编写一个通用函数来对二维列表进行排序。基本上,我希望有一个函数,我可以传递大列表,以及一个或多个列的键,我希望对大列表进行排序。显然,我希望传递的第一个键是主排序点,然后是第二个键,以此类推 还困惑吗 下面是我想做的一个例子 Joel 18 Orange 1 An
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
有什么线索吗?这将按第2列和第3列进行排序:
a.sort(key=operator.itemgetter(2,3))
确保已将数字转换为整数,否则它们将按字母顺序排序,而不是按数字排序
# Sort the list in place
def sortByColumn(A,*args):
import operator
A.sort(key=operator.itemgetter(*args))
return A
或
这里的关键思想(双关语)是使用返回元组的键函数。
下面的关键函数是lambda x:(参数中的idx为x[idx])
x
设置为等于aList的一个元素,即一行数据。它返回一个值的元组,而不仅仅是一个值。sort()方法根据列表的第一个元素进行排序,然后断开与第二个元素的联系,依此类推。看
这些数字必须转换成整数,这太棒了。我从来没有听说过itemgetter(或者attrgetter,我现在也看到了)。这正是我想要的。谢谢!
# Leave the original list alone and return a new sorted one
def sortByColumn(A,*args):
import opertator
return sorted(A,key=operator.itemgetter(*args))
import operator:
def sortByColumn(bigList, *args)
bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place
#!/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