如果在别处得到回答,请道歉;我试过搜索,但没有发现任何能回答我问题的东西(或许我有,但不理解)......
我是Python的新手(v2.6.2)并且有一个包含浮点值的列表列表,看起来类似于以下内容(除了完整的东西每个列表有超过200万个条目):
cat = [[152.123, 150.456, 151.789, ...], [4.123, 3.456, 1.789, ...], [20.123, 22.456, 21.789, ...]]
现在我想做的是按照第三个列表的元素的升序排序所有3个列表,这样我得到:
cat_sorted = [[152.123, 151.789, 150.456, ...], [4.123, 1.789, 3.456, ...], [20.123, 21.789, 22.456, ...]]
我尝试了一些东西,但是他们没有给我我正在寻找的东西(或者我可能错误地使用它们)。有没有办法做我想要的,如果有的话,最简单的是什么?最快(考虑到我有3×2百万条款)?有没有办法用另一个列表对一个列表进行排序?
答案 0 :(得分:8)
这将是痛苦的,但使用默认的python你有两个选择:
使用enumerate()
装饰第一个和第二个列表,然后使用索引对这些列表进行排序以引用第三个列表中的值:
cat_sorted = [
[e for i, e in sorted(enumerate(cat[0]), key=lambda p: cat[2][p[0]])],
[e for i, e in sorted(enumerate(cat[1]), key=lambda p: cat[2][p[0]])],
sorted(cat[2])
]
虽然可以帮助对cat[2]
就地排序而不是使用sorted()
;你无法使用sorted()
来解决其他两个问题。
zip()
将三个列表放在一起,然后对这个新列表列表的第三个元素进行排序,然后再次zip()
以回到原始结构:
from operator import itemgetter
cat_sorted = zip(*sorted(zip(*cat), key=itemgetter(2)))
两者都不是性能破坏者,也不是数百万个数字的普通python列表。
答案 1 :(得分:4)
如果您愿意使用其他库,我建议Python Pandas。它有一个类似于R data.frame
的DataFrame对象,并接受构造函数中的列表列表,这将创建一个3列数据数组。然后,您可以轻松使用内置pandas.DataFrame.sort
函数按第三列(升序或降序)排序。
有许多简单的Python方法可以做到这一点,但考虑到问题的大小,在Pandas中使用优化函数是一种更好的方法。如果您需要从排序数据中获得任何类型的汇总统计数据,那么Pandas就是一个明智的选择。
答案 2 :(得分:2)
答案 3 :(得分:1)
为了完成,使用numpy的解决方案:
import numpy as np
cat = [[152.123, 150.456, 151.789],
[4.123, 3.456, 1.789],
[20.123, 22.456, 21.789]]
cat = np.array(cat)
cat_sorted = cat[:, cat[2].argsort()]
print cat_sorted
[[ 152.123 151.789 150.456]
[ 4.123 1.789 3.456]
[ 20.123 21.789 22.456]]
答案 4 :(得分:0)
根据Martijn Pieters和pcalcao的精彩答案,这是另一种方法
def sort_by_last(ll):
"""
>>> sort_by_last([[10, 20, 30], [3, 2, 1]])
[[30, 20, 10], [1, 2, 3]]
>>> sort_by_last([[10, 20, 30], [40, 50, 60], [3, 2, 1]])
[[30, 20, 10], [60, 50, 40], [1, 2, 3]]
>>> sort_by_last([[10, 20, 30], [40, 50, 60], [1, 1, 1]])
[[10, 20, 30], [40, 50, 60], [1, 1, 1]]
>>> sort_by_last([[10, 20, 30], [40, 50, 60], [1, 3, 1]])
[[10, 30, 20], [40, 60, 50], [1, 1, 3]]
>>> sort_by_last([[152.123, 150.456, 151.789], [4.123, 3.456, 1.789], [20.123, 22.456, 21.789]])
[[152.123, 151.789, 150.456], [4.123, 1.789, 3.456], [20.123, 21.789, 22.456]]
"""
return [sorted(x, key=lambda y: ll[-1][x.index(y)]) for x in ll]
大字符串有一个带doctest的文档字符串,用于测试函数将其复制到文件并运行它
python -m doctest -v <file>
答案 5 :(得分:0)
此处,keys
是索引的排序列表。
keys = sorted(range(len(cat[2])), key=cat[2].__getitem__)
cat_sorted = [[cat[i][k] for k in keys] for i in range(3)]