Python 如何将不确定性表达式(例如3.23+;/-0.01)从字符串转换为浮点?

Python 如何将不确定性表达式(例如3.23+;/-0.01)从字符串转换为浮点?,python,sympy,Python,Sympy,我从.csv文件中获取一些数据,并将其放入Python脚本中的dict中,这时我注意到其中一列中包含不确定值(例如3.23+/-0.01)的差异。在创建新表并将结果导出到Excel后,此列不会按数字进行排序–只有第一个值被视为数字,而其余值被视为表达式 我怀疑这可能与以下事实有关:当我第一次读取.csv文件时,它是用'rU'读取的(读取通用字符,而不是读取二进制文件的'rb')。我这样做是因为.csv文件中的原始+/-符号没有被正确读取。因此,在读入.csv文件后,它将“\xb1”作为+/-符号

我从.csv文件中获取一些数据,并将其放入Python脚本中的dict中,这时我注意到其中一列中包含不确定值(例如3.23+/-0.01)的差异。在创建新表并将结果导出到Excel后,此列不会按数字进行排序–只有第一个值被视为数字,而其余值被视为表达式

我怀疑这可能与以下事实有关:当我第一次读取.csv文件时,它是用'rU'读取的(读取通用字符,而不是读取二进制文件的'rb')。我这样做是因为.csv文件中的原始+/-符号没有被正确读取。因此,在读入.csv文件后,它将“\xb1”作为+/-符号的占位符,随后我再次将其替换为“+/-”

import csv
import re    

folder_contents={}
with open("greencandidates.csv", "rU") as csvfile:
    green= csv.reader(csvfile, dialect= 'excel')
    for line in green:
        candidate_number= line[0]
        fluorescence= line[1].replace(" \xb1 "," +/- ")
        folder_contents[candidate_number]= [fluorescence]
然而,考虑到有很多数据是从原始的.csv文件中处理的,我真的希望能够按降序(从大到小)对数据进行排序。虽然有一个模块允许创建不确定性表达式,(),但我不确定如何使用它,以便将不确定性表达式视为可以按降序排列的浮点数。我在下面发布了一种使用Symphy软件包创建不确定性表达式的方法

from uncertainties import ufloat

x = ufloat(1, 0.1)  # x = 1+/-0.1 

在排序中使用键函数,例如:

def u_float_key(num):
    return float(num.split('+')[0])
然后,您可以使用内置的甚至与字符串排序:

sorted(results, key=u_float_key, reverse=True)

>>> test = ["1+/-1", "0.2+/-0", "4+/-2", "3+/-100"]
>>> sorted(test, key=ufloatkey)
['0.2+/-0', '1+/-1', '3+/-100', '4+/-2']

如何分类?3.1+/-0.1是否大于(或小于)3.11+/-0.05?您是想简单地提取不确定度表达式的浮点分量,并按该值排序吗?@DavidZemens我希望对其进行排序,使31.1+/-0.01的值大于3.11+/-0.01。为了简单起见,我认为最好只考虑不确定性表达式的第一部分(即在+/-符号之前的数目)来评估它的siz。OK,因此,如果将不确定表达式作为字符串,在<代码> +/-< /代码>上拆分,并将生成的值修整,转换为浮点,并在此基础上对列表或其他数据结构进行排序。这行得通吗?尽管您的方法行得通,但出于某种原因,Excel似乎不希望根据第一个整数(即+/-符号前的数字)对值进行排序。它只按第一个数字对值进行排序。我已经完全按照IDE中的原样(使用我的值)运行了您的代码,它返回正确排序的数字,因此我真的不知道这里发生了什么。我最终决定放弃整个不确定性表达式,只保留主整数,以使数据处理和可视化更容易。如果我们需要返回并获取所有不确定性的值,那么我们可能会执行
float(num.split(+')[2])
以获取所述数字,然后使用
x=ufloat(1,0.1)
@BobMcBobson将它们放回本地
排序(测试)
似乎在没有键的情况下工作,如果它们的位数都没有差异(全部为个位数+-任意)