Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在对列表中的数字进行排序时忽略零_Python - Fatal编程技术网

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

Python在对列表中的数字进行排序时忽略零,python,Python,我试图使用python内置的排序功能对一个美元金额列表进行从低到高的排序,但是当我调用它时,它会对数字进行超级疯狂的排序。它从10000美元开始,然后上升到190000美元,这是最高的,然后跳到2000美元,从表面上看是因为2比1大。我不知道如何纠正这一点。我使用的代码如下 numbers=[['$10014.710000000001'], ['$10014.83'],['$11853.300000000001'], ['$19060.010000000006'],['$2159.1099999

我试图使用python内置的排序功能对一个美元金额列表进行从低到高的排序,但是当我调用它时,它会对数字进行超级疯狂的排序。它从10000美元开始,然后上升到190000美元,这是最高的,然后跳到2000美元,从表面上看是因为2比1大。我不知道如何纠正这一点。我使用的代码如下

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!