Python在对列表中的数字进行排序时忽略零
我试图使用python内置的排序功能对一个美元金额列表进行从低到高的排序,但是当我调用它时,它会对数字进行超级疯狂的排序。它从10000美元开始,然后上升到190000美元,这是最高的,然后跳到2000美元,从表面上看是因为2比1大。我不知道如何纠正这一点。我使用的代码如下Python在对列表中的数字进行排序时忽略零,python,Python,我试图使用python内置的排序功能对一个美元金额列表进行从低到高的排序,但是当我调用它时,它会对数字进行超级疯狂的排序。它从10000美元开始,然后上升到190000美元,这是最高的,然后跳到2000美元,从表面上看是因为2比1大。我不知道如何纠正这一点。我使用的代码如下 numbers=[['$10014.710000000001'], ['$10014.83'],['$11853.300000000001'], ['$19060.010000000006'],['$2159.1099999
numbers=[['$10014.710000000001'], ['$10014.83'],['$11853.300000000001'],
['$19060.010000000006'],['$2159.1099999999997'],['$3411.1400000000003']]
print(sorted(numbers))
你不是在对数字排序,而是对字符串排序,这就解释了奇怪的结果。相反,将您的类型更改为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')]
你不是在对数字排序,而是对字符串排序,这就解释了奇怪的结果。相反,将您的类型更改为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')]
您的数字是货币值。因此,正如下面的评论所指出的,使用Python的模块可能是有意义的,它比float数据类型提供了一些优势。有关更多信息,请参阅链接 然而,如果我怀疑这只是为了更好地了解Python的一个练习。您可以寻找更简单的解决方案:
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')]
排序不起作用的原因是,数字作为字符串存储在另一个列表中的列表中。在排序产生您想要的效果之前,必须将它们转换为整数或浮点数:
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]
$2159.1099999999997
$3411.1400000000003
$10014.710000000001
$10014.83
$11853.300000000001
$19060.010000000006
当您查看floatnumber[0][1:]时,然后[0]会取内部数字列表中的第一个也是唯一一个数字,[1:]会去掉$符号,最后float会转换为浮点数
如果您想要回$sign:
for number in numbers_float:
print("${}".format(number))
其中打印:
[2159.1099999999997, 3411.1400000000003, 10014.710000000001, 10014.83, 11853.300000000001, 19060.010000000006]
$2159.1099999999997
$3411.1400000000003
$10014.710000000001
$10014.83
$11853.300000000001
$19060.010000000006
您的数字是货币值。因此,正如下面的评论所指出的,使用Python的模块可能是有意义的,它比float数据类型提供了一些优势。有关更多信息,请参阅链接 然而,如果我怀疑这只是为了更好地了解Python的一个练习。您可以寻找更简单的解决方案:
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')]
排序不起作用的原因是,数字作为字符串存储在另一个列表中的列表中。在排序产生您想要的效果之前,必须将它们转换为整数或浮点数:
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]
$2159.1099999999997
$3411.1400000000003
$10014.710000000001
$10014.83
$11853.300000000001
$19060.010000000006
当您查看floatnumber[0][1:]时,然后[0]会取内部数字列表中的第一个也是唯一一个数字,[1:]会去掉$符号,最后float会转换为浮点数
如果您想要回$sign:
for number in numbers_float:
print("${}".format(number))
其中打印:
[2159.1099999999997, 3411.1400000000003, 10014.710000000001, 10014.83, 11853.300000000001, 19060.010000000006]
$2159.1099999999997
$3411.1400000000003
$10014.710000000001
$10014.83
$11853.300000000001
$19060.010000000006
这里的关键洞察是列表中的值实际上是字符串,并且字符串是按词汇进行比较的:字符串中的每个字符一次比较一个,直到第一个不匹配的字符。所以aa排序在ab之前,但这也意味着1000排序在a2之前。如果要以不同的方式进行排序,则需要告诉排序方法或排序函数要排序的依据 在这种情况下,您可能应该使用十进制模块。您需要排序方法的键属性。这将对现有列表进行排序,仅在排序过程中使用转换后的值
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))
演示:这里的关键洞察是,列表中的值实际上是字符串,字符串是按词汇进行比较的:字符串中的每个字符一次比较一个,直到第一个不匹配的字符。所以aa排序在ab之前,但这也意味着1000排序在a2之前。如果要以不同的方式进行排序,则需要告诉排序方法或排序函数要排序的依据 在这种情况下,您可能应该使用十进制模块。您需要排序方法的键属性。这将对现有列表进行排序,仅在排序过程中使用转换后的值
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))
演示:这是因为您的数字不是数字,糟糕的python必须对字符串进行字典排序。要进行数字排序,您需要临时转换为数字进行排序。可能重复。可能重复,因为您的数字不是数字,而且糟糕的python必须按字典顺序对字符串进行排序。要进行数字排序,您需要临时转换为数字进行排序。可能重复。可能重复好的,这很有意义。我要试一试。非常感谢!不要对货币值使用float,因为它与十进制数字的四舍五入方式不同。您可能想改用十进制模块。@DanielPryden我高度怀疑这是n
这里没有必要,但你提到它绝对是对的。不要紧,所以我把它作为免责声明添加到了答案中。好吧,这是有道理的。我要试一试。非常感谢!不要对货币值使用float,因为它与十进制数字的四舍五入方式不同。您可能想改用十进制模块。@DanielPryden我高度怀疑这里没有必要这样做,但您提到它肯定是对的。没有什么坏处,所以我把它作为免责声明添加到了答案中。是的,列表格式中的列表是由于我必须对数据执行一些其他功能。谢谢你的投入!如果您不希望在排序列表中使用这种封装,只需将排序的[[flotel[0][1:]更改为排序的[flotel[0][1:]以表示数字中的el]:不要对货币值使用float!是的,列表格式中的列表是由于我必须对数据执行的其他一些功能造成的。谢谢你的投入!如果您不希望在排序列表中使用这种封装,只需将排序的[[flotel[0][1:]更改为排序的[flotel[0][1:]以表示数字中的el]:不要对货币值使用float!