Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按不同的键数对多维列表进行排序_Python_Sorting - Fatal编程技术网

Python 按不同的键数对多维列表进行排序

Python 按不同的键数对多维列表进行排序,python,sorting,Python,Sorting,我读过书,但没有为我工作 编辑:我描述的功能就像Excel中的排序功能。。。如果这更清楚的话 这是我的情况,我有一个以制表符分隔的文本文档。大约有125000行,每行6列(列由制表符分隔)。我已将文档拆分为二维列表 我正在尝试编写一个通用函数来对二维列表进行排序。基本上,我希望有一个函数,我可以传递大列表,以及一个或多个列的键,我希望对大列表进行排序。显然,我希望传递的第一个键是主排序点,然后是第二个键,以此类推 还困惑吗 下面是我想做的一个例子 Joel 18 Orange 1 An

我读过书,但没有为我工作

编辑:我描述的功能就像Excel中的排序功能。。。如果这更清楚的话

这是我的情况,我有一个以制表符分隔的文本文档。大约有125000行,每行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

有什么线索吗?

这将按第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