![](/img/trans.png)
[英]How to sort only some elements of a sublist from a nested list in Python 3
[英]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.