在python中以数字方式排序浮点数 - 不是以ascii顺序排列

时间:2011-09-07 06:01:10

标签: python sorting floating-point

这可能听起来像一个愚蠢的问题,但我试图找到一个没有太大成功的答案。我有一份清单清单:

for v in sorted(list):
    print v


[885.1, 12824]
[885.1, 19843]
[885.11, 1319]
[885.12, 1155]
[885.13, 12844]
[885.14, 33602]
[885.15, 11324]
[885.16, 44040]
[885.2, 119283]
[885.3, 8424]

我使用排序函数遍历我的列表 - 但是如上所述以ASCII顺序显示项目 - 它们是否可以按人类可读顺序排序为浮点数?即:

[885.1, 19843]
[885.2, 119283]
[885.3, 8424]
[885.11, 1319]
[885.12, 1155]
[885.13, 12844]
[885.14, 33602]
[885.15, 11324]
[885.16, 44040]

我是否需要创建somekind的索引?将我的浮点数转换为整数?任何帮助非常感谢。

大卫。

4 个答案:

答案 0 :(得分:3)

首先将float转换为字符串并将其拆分为“。”:

sorted(a, key=lambda x:map(int, str(float(x[0])).split(".")))

答案 1 :(得分:1)

这称为“natsort”(自然排序)。一个快速的谷歌给我这个:http://www.skynet.ie/~caolan/Packages/python-natsort.html(虽然没有尝试过)。也许它可以帮助你。

哦,这不一定是ASCII排序,它只是数字顺序,你知道,就像真正的轴

答案 2 :(得分:1)

你需要给出一个比较函数。如下所示:

sorted(list, cmp=lambda x, y: cmp(x[0], y[0]))

只需编写您想要的功能并将其插入即可。

你可能想要像反向基数那样的东西。

答案 3 :(得分:1)

这是一种黑客攻击,但是:

a = [
    [885.1, 19843],
    [885.1, 12824],
    [885.11, 1319],
    [885.12, 1155],
    [885.13, 12844],
    [885.14, 33602],
    [885.15, 11324],
    [885.16, 44040],
    [885.2, 119283],
    [882.8, 8424],
    [882.75, 8424],
    [885.3, 8424]
]

for v in sorted(a, key=lambda t: str(t[0]).split(".")[0] + ("%05d" % int(str(t[0]).split(".")[1])) + "," + str(t[1])):
    print v

结果是

[882.8, 8424]
[882.75, 8424]
[885.1, 12824]
[885.1, 19843]
[885.2, 119283]
[885.3, 8424]
[885.11, 1319]
[885.12, 1155]
[885.13, 12844]
[885.14, 33602]
[885.15, 11324]
[885.16, 44040]

免责声明:这假定小数点后最多5个位置。相应调整。