(Python) 在字符串中添加负数

Posted

技术标签:

【中文标题】(Python) 在字符串中添加负数【英文标题】:(Python) Adding Negative Numbers within a String 【发布时间】:2020-08-22 07:38:22 【问题描述】:

我为自己在学习 Python 时不必问任何问题而感到非常自豪。 但是,我似乎无法弄清楚这一点。

我正在尝试附加从 json.dump 获取的数据,保留它直到满足循环,然后添加所有附加的数字。

下面是我的一段代码(你可以取笑我,我敢肯定这很可怕)。 目的是:如果文本等于响应文本,则解析json字典并输入一个级别。一旦进入“orderFillTransaction”级别,取“pl”的值并追加。

if 'orderFillTransaction' in json_data:
    print("Json_Data:", type(json_data))
    Closed_ID2 = json_data['orderFillTransaction']
    PL_List = (Closed_ID2['pl'])
    print("PL_List:", PL_List, type(PL_List))
    PL.append(PL_List)
    print("PL.append:", PL, type(PL))

下面是输出:

Json_Data: <class 'dict'>
PL_List: -0.1300 <class 'str'>
PL.append: ['-0.1300', '-0.1300'] <class 'list'>

问题是,如果我尝试 sum(),它会出错,如果我 float(),我会得到一些奇怪的数字;我似乎无法弄清楚如何将每个项目添加在一起。 如果重要的话,这些数字通常是负数。

我经常会得到以下错误:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

ValueError: invalid literal for int () with base 10

我知道它与列表中的 str 而不是 int 有关,但是,我知道必须有一些解决方案。

任何方向将不胜感激。 谢谢!

【问题讨论】:

你试过eval() sum([eval(num) for num in PL]) 你在使用float() 时有什么尝试,你得到了哪些“奇怪”的数字? 这个问题与 json 无关(我认为) 【参考方案1】:

试试:

>>> PL = ['-0.1300', '-0.1300']
>>> print(sum([float(i) for i in  PL]))

输出:

-0.26

我不知道你使用float 得到了哪些“奇怪”的数字,但上面的代码对我有用。

【讨论】:

谢谢!使用上面的代码弹出无法添加 str 错误。尽管使用 sum([eval(num) for num in PL]),但我确实让它工作了。如果我没记错的话,浮点问题就是之前的问题。【参考方案2】:

如果换行

PL.append(PL_List)

PL.append(float(PL_List))

(假设 PL 为空,或者一开始就包含其他整数/浮点数),那么您应该能够简单地求和(PL)。

您引用的类型错误表明在某些时候尝试将数字添加到字符串中。在列表追加之前/期间将每个数字转换为浮点数应该可以解决该问题。

第二个错误可以通过使用 float() 而不是 int() 来避免。详情请见this link。

最后,你提到的那些奇怪的数字听起来好像是 python 对浮点数表示的结果。

例如:

>>> numbers = [float(0.67), float(1.23), int(5), float("-1.2345")]
>>> print(numbers)
[0.67, 1.23, 5, -1.2345]
>>> sum(numbers)
5.665500000000001

浮点小数精度有很好的解释here

【讨论】:

【参考方案3】:

这似乎是您遇到的浮点问题。这是因为浮点数不能准确地存储在计算机上——我们需要存储它的一些近似值。你可以通过here了解更多。

可能的解决方法:您可以创建一个函数来查找 PL 数组的总和,该函数对总和进行一些后舍入,这样它就不会看起来像一团糟,但是,请确保它不会影响任何进一步的计算。

def sum_str_array(array):
    total = 0
    for item in array:
        total += float(item)
    return round(total, 5)   #rounded to 5 digits precision after summing all the elements

a = ['1.01', '-0.99', '-0.02']
print (sum_str_array(a))

四舍五入后这将为您提供 0.0 作为答案,否则为 1.734723475976807e-17。希望这会有所帮助。

【讨论】:

以上是关于(Python) 在字符串中添加负数的主要内容,如果未能解决你的问题,请参考以下文章

Python流程图判断一个数是正数,负数还是0?

python全栈学习总结更新字符串:字符串格式化方法

python基本数据类型;关于字符串格式化的不出

python基本数据类型;关于字符串格式化的不出

Python如何在字符串里面提取数字的同时把数字中的小数点也保留下来?

Python学习之旅 —— 基础篇字符串格式化递归生成器&迭代器模块