Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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_Data Structures_Multidimensional Array_Sorting - Fatal编程技术网

Python 如何在创建列表时对列表进行排序

Python 如何在创建列表时对列表进行排序,python,data-structures,multidimensional-array,sorting,Python,Data Structures,Multidimensional Array,Sorting,我正在读取一个文件,并在Python中提取包含一些字符串和数字的数据。我将这些信息存储为列表列表,如下所示: dataList = [ ['blah', 2, 3, 4], ['blahs', 6, 7, 8], ['blaher', 10, 11, 12], ] 我想按子列表的第二个元素对dataList进行排序:dataList[][1] 我想当我想添加它们时,我可以使用insort或bisect right,但我不知道如何让它看起来像子列表的第二个元素 有什么想法吗?我只是在末尾

我正在读取一个文件,并在Python中提取包含一些字符串和数字的数据。我将这些信息存储为列表列表,如下所示:

dataList = [

['blah', 2, 3, 4],

['blahs', 6, 7, 8],

['blaher', 10, 11, 12],

]
我想按子列表的第二个元素对dataList进行排序:dataList[][1]

我想当我想添加它们时,我可以使用insort或bisect right,但我不知道如何让它看起来像子列表的第二个元素

有什么想法吗?我只是在末尾添加数据,然后进行线性排序,以便稍后再查找。但是,在这里输入成千上万的子列表,然后搜索10万个条目,这需要一段时间

dataList.sort(key=lambda x: x[1])
这将按每个项目中的第二个元素对列表进行排序


正如评论中所指出的,只排序一次(在最后)要有效得多。Python的内置排序方法经过了大量优化,可以快速工作。测试后,在各种尺寸列表中(我测试的尺寸高达600000),内置排序始终比使用另一个答案中建议的排序快3.7倍左右。

取决于几件事,但首先想到的是使用heapq模块:

import heapq
heap = []
for row in rows:
    heapq.heappush(heap, (row[1], row))
这将创建一个充满元组的堆,其中第一个元素是要排序的元素,第二个元素是行

从堆中读回它们的最简单方法是复制它,然后弹出项目:

new_heap = list(heap)
while new_heap:
    _, row = heapq.heappop(new_heap)
    print row
将每个项插入堆的运行时间是
O(lg N)
,因此创建堆需要
O(N lg N)
时间,从堆中弹出项也需要
O(lg N)
时间,因此遍历它需要
O(N lg N)
时间

如果这些折衷不理想,您可以使用二叉搜索树(标准库中没有,但是),或者按照其他评论员的建议,在读取行后对行进行排序:
rows.sort(key=lambda row:row[1])

现在,在实践中,除非您处理的是大量的行,否则在加载列表后对其进行排序几乎肯定会更快(即,使用
.sort()
方法)…因此,尝试一些方法,看看哪种方法最有效


最后,
bisect
是一个糟糕的主意,因为插入Python列表需要
O(N)
时间,因此使用bisect插入项目将需要
O(N lg N)
每个项目的时间,因此总时间为
O((N lg N)*N)=O(N**2)
时间。

为什么不能添加所有内容,然后对结果进行排序?在我看来,随走排序效率较低……我曾考虑过这一点,但假设在添加项目时保持排序效率更高。也许不是吗?@在一个Python列表中间插入的Erik是如果你真的希望它在你创建它时保持排序,看看你所描述的是等价的,它运行在O(n ^ 2)的时间内。大多数好的排序算法(比如or)都是在O(n logn)时间内运行的。因此,在创建列表时保持排序并不是更有效的方法。这并没有解决OP关于在创建列表时保持排序的问题。对,我遇到了这个问题。在所有数据都进入后进行排序是否比保存排序列表更有效?@ErikS:是的,这可能更有效。它的时间复杂度与heap-insert-then-pop-answer相同,但系数和常数项可能要小得多。如果你真的关心性能,我会测试它@ErikS的一个快速实验(在1000个长度为10000的列表上)表明,堆方法比Pythons专门构建的排序慢3.5倍。在实践中(在Python中),我怀疑这比创建列表然后对其排序快,尽管它值得测试。@DavidRobinson它不快,实际上慢得多。Python的排序已经得到了极大的优化!