我正在尝试使用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))
答案 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))