繁体   English   中英

对嵌套列表中的每个子列表进行排序

[英]Sort each sublist in a nested list

例子:

如果给出:

list1 = [[4,2],[9,4],[3,7],[7,3],[2,6],[1,4]]

我想让它们从最小到最大排序,例如:

[[2,4],[4,9],[3,7],[3,7],[2,6],[1,4]]

列表中这些列表的顺序无关紧要。 最后,我只想让每个核心元素都有相同的组合。 像 [3,7] 和 [3,7] 而不是 [3,7] 和 [7,3]

一种方法是使用sorted映射:

list(map(sorted, list1))
# [[2, 4], [4, 9], [3, 7], [3, 7], [2, 6], [1, 4]]

这与执行以下操作相同:

[sorted(i) for i in list1]

这取决于:

  • 如果要保留原始数据,即获取包含新子列表的新 object ,可以使用另一个答案中提出的解决方案

    list1 = [[4,2],[9,4],[3,7],[7,3],[2,6],[1,4]] list2 = [sorted(sublist) for sublist in list1]

    但请注意,这是有代价的,因为您必须为新的子列表和外部容器分配新的 memory,而且减速也不容忽视;

  • 如果您在排序操作后不需要原始数据,您可以使用列表对象是可变的这一事实,因此可以就地进行排序

    for sublist in list1: sublist.sort()

    这第二种方法的优点是不需要额外的 memory 并且它有点快但是当然如果你之后需要原始数据......


我提到.sort()sorted()快,主要是由于分配了新的 memory,所以让我介绍一个使用 IPython 的%timeit魔法的简单的基准测试

In [25]: l1 = [i for i in range(100000)]                                        

In [26]: %timeit -c -n 30 -r 20 (shuffle(l1) or l1)                             
119 ms ± 1.52 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [27]: %timeit -c -n 30 -r 20 sorted(shuffle(l1) or l1)                       
154 ms ± 1.41 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [28]: %timeit -c -n 30 -r 20 (shuffle(l1) or l1).sort()                      
148 ms ± 2.15 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [29]: print("%.3f%%"%(100*(154-148)/(148-119)))                                     
20.690%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM