在对列表中的数字进行排序时,Python会忽略零

时间:2018-12-15 22:27:11

标签: python

我正在尝试使用python的内置排序功能对从最低到最高的美元金额列表进行排序,但是当我调用它时,它将对数字进行超级螺丝排序。它从10,000美元开始,然后上升到19,0000美元(最高),然后跳到2,000美元,表面上从那里开始计数,因为2大于1。我不知道如何对此进行更正。我使用的代码如下。

numbers=[['$10014.710000000001'], ['$10014.83'],['$11853.300000000001'],
['$19060.010000000006'],['$2159.1099999999997'],['$3411.1400000000003']]

print(sorted(numbers))

3 个答案:

答案 0 :(得分:2)

您不是在对数字排序,而是对字符串进行排序,这说明了“奇怪”的结果。相反,将您的类型更改为float并对结果列表进行排序:

In [3]: sorted([[float(el[0][1:])] for el in numbers])
Out[3]: 
[[2159.1099999999997],
 [3411.1400000000003],
 [10014.710000000001],
 [10014.83],
 [11853.300000000001],
 [19060.010000000006]]

我需要el[0],因为每个数字都在其自己的列表中,这不是一个好的样式,但是我想您有这样做的理由。 [1:]去除了$符号。

编辑在评论中确实很不错。更强大的解决方案:

from decimal import Decimal

import decimal

decimal.getcontext().prec = 4

sorted([Decimal(el[0][1:]) for el in numbers])
Out[8]: 
[Decimal('2159.1099999999997'),
 Decimal('3411.1400000000003'),
 Decimal('10014.710000000001'),
 Decimal('10014.83'),
 Decimal('11853.300000000001'),
 Decimal('19060.010000000006')]

答案 1 :(得分:2)

您的数字是货币值。因此,如下面的注释中所指出的那样,使用Python的decimal模块可能比float数据类型具有更多优势。 (请参阅链接以获取更多信息。)


但是,正如我怀疑的那样,如果这仅是更好地了解Python的一种做法。您可能会寻找一个更简单的解决方案:

之所以无法进行排序,是因为您的数字以字符串形式存储在另一个列表中的列表中。您必须先将它们转换为整数或浮点数,然后排序才能达到您想要的效果:

numbers=[
    ['$10014.710000000001'],
    ['$10014.83'],
    ['$11853.300000000001'],
    ['$19060.010000000006'],
    ['$2159.1099999999997'],
    ['$3411.1400000000003']
]

numbers_float = [float(number[0][1:]) for number in numbers]
numbers_float.sort()

print(numbers_float)

哪些印刷品:

[2159.1099999999997, 3411.1400000000003, 10014.710000000001, 10014.83, 11853.300000000001, 19060.010000000006]

当您查看float(number[0][1:])时,[0]会获得(内部)号码列表的第一个(也是唯一的)号码,[1:]会剥去$符号,最后float转换为浮点数。

如果您想让$重新登录:

for number in numbers_float:
    print("${}".format(number))

哪些印刷品:

$2159.1099999999997
$3411.1400000000003
$10014.710000000001
$10014.83
$11853.300000000001
$19060.010000000006

答案 2 :(得分:2)

这里的关键见解是列表中的值实际上是字符串,并且按词法对字符串进行比较:一次比较一个字符串中的每个字符,直到第一个不匹配的字符。因此,“ aa”在“ ab”之前排序,但这也意味着“ a1000”在“ a2”之前排序。如果要以其他方式排序,则需要告诉sort方法(或sorted函数)要使用的排序方式。

在这种情况下,您可能应该使用decimal模块。并且您需要key方法的sort属性。这将对您现有的列表进行排序,仅在排序过程中使用转换后的值。

import decimal

def extract_sortable_value(value):
    # value is a list, so take the first element
    first_value = value[0]
    return decimal.Decimal(first_value.lstrip('$'))

numbers.sort(key=extract_sortable_value)

等效地,您可以这样做:

print(sorted(numbers, key=extract_sortable_value))

演示:https://repl.it/repls/MiserableDarkPatches