Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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_List_Printing - Fatal编程技术网

在Python中打印列表时进行脏打印

在Python中打印列表时进行脏打印,python,list,printing,Python,List,Printing,我是一个Python新手,我注意到像print这样的基本函数中有一些奇怪的东西 让代码解释一下。我想将观察值的所有异常值保存在一个列表中。因此,我编写了以下代码片段: #import numpy as np def compute_outliers(obs): outliers=[] q1 = np.percentile(obs, 25) q3 = np.percentile(obs, 75) iqr = q3 - q1 print('q1: ', q

我是一个Python新手,我注意到像print这样的基本函数中有一些奇怪的东西

让代码解释一下。我想将观察值的所有异常值保存在一个列表中。因此,我编写了以下代码片段:

#import numpy as np

def compute_outliers(obs):
    outliers=[]

    q1 = np.percentile(obs, 25)
    q3 = np.percentile(obs, 75)
    iqr = q3 - q1
    print('q1: ', q1)
    print('q3: ', q3)
    lower_limit = q1 - 1.5 * iqr
    upper_limit = q3 + 1.5 * iqr

    for i in obs:
        if i < lower_limit or i > upper_limit:
            outliers.append(i)
    return outliers

outliers = compute_outliers(data)
输出正常:

20.0
0.0
17.6
2.7
18.9
0.0
18.0
而如果我键入:

print(outliers)
这是输出:

[20.0, 0.0, 17.600000000000001, 2.7000000000000002, 18.899999999999999, 0.0, 18.0]
您可以看到第三、第四、第五个值为“脏”。我应该简单地使用第一个代码进行打印,但我对所有这些是如何工作的很抱歉,所以我想知道为什么会发生这种情况

编辑


我认为完成这个问题将有助于了解如何“修复”这个问题,从而打印正确的值列表。你能帮忙吗?

这种影响是由以下因素综合作用的结果:

列表是一种容器类型。 printfoo使用strfoo,称为foo.\uu str\uu。 float._ustr___;舍入以使十进制表示看起来更漂亮,而float.__repr___;则尽量保持精度。
是的,这是一个众所周知的浮点问题和Python中repr和str的一些技巧

如果使用Python 2,可以尝试以下方法:

print(0.1 + 0.2)
# 0.3
print([0.1 + 0.2])
# [0.30000000000000004]
这是因为在IEEE 754浮点数中,0.1+0.2实际上是0.3。这是因为0.1不是1/10,因为后者根本不能作为有限二进制浮点数写入

当您对一个数字调用print时,它会对该数字使用。str是一种以可读性为目标的表示法,它可以省略一些无关紧要的数字,使数字更具可读性

另一方面,当您打印列表时,每个项目都会使用一种将该列表字符串化的算法。repr的目标是精确性和再现性,因此它提供重建数字所需的所有数字。这并不意味着它使用了所有的数字,例如repr0.1仍然是0.1,而不是可以通过打印%.25f%0.1获得的0.100000000000000551151,但它可以使用比str更多的数字

编辑。如果您想在打印列表时获得更为用户友好的输出,可以通过以下方式手动完成:

print(", ".join("{:.2f}".format(x) for x in outliers))

有关不同的方法和更多格式选项,请参见。

你好,伊利亚,谢谢你的解释,这对我来说是非常深刻的:请看编辑:有用的答案,你也可以看一下编辑吗?@Bernhart我没有看到任何编辑。也许在我看之前已经被拒绝了?
print(", ".join("{:.2f}".format(x) for x in outliers))