如何在Python中原地排序平行数组?
有没有一种简单的方法(也就是不需要自己写排序函数)来在Python中对平行列表进行排序,而且不需要多余的复制?比如说:
foo = range(5)
bar = range(5, 0, -1)
parallelSort(bar, foo)
print foo # [4,3,2,1,0]
print bar # [1,2,3,4,5]
我见过使用 zip
的例子,但如果可以轻松避免的话,把所有数据从平行列表复制到一个元组列表再复制回来,感觉有点傻。
4 个回答
0
要实现这个功能,你需要自己写一个排序的代码。
不过:这些不必要的复制真的会影响你的应用程序吗?我觉得Python的某些部分也有点不够高效,但对于我需要的功能来说,它们的效率已经足够了。
3
有没有简单的方法?有的。用 zip。
有没有不使用 zip 的简单方法?没有。
如果你能详细说明一下为什么不想用 zip,那就更好了。要么你是在复制对象,这种情况下 Python 会通过引用来复制,要么你是在复制一些非常轻量的东西,放到一个轻量的元组里,这样其实就没必要进行优化了。
如果你真的不在乎执行速度,但出于某种原因特别担心内存占用,你可以自己写一个冒泡排序(或者你喜欢的排序算法),在对关键列表进行交换时,同时交换目标列表的元素。我觉得这可不是简单的方法,但确实可以减少你需要处理的数据量。
6
这里有个简单的方法:
perm = sorted(xrange(len(foo)), key=lambda x:foo[x])
这个方法会生成一个排列的列表 - perm[i] 的值是 foo 中第 i 小的值的索引。然后,你可以按顺序访问这两个列表:
for p in perm:
print "%s: %s" % (foo[p], bar[p])
不过,你需要测试一下,看看这个方法是否真的更高效 - 我怀疑效果不会太大。