如何将之前在循环(即列表)中定义的变量用于单独的函数?

2024-10-02 18:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从中读取的文本文件,我创建了两个变量ppmpeakAvgpeakAvg是我想重用的变量,它是在循环中定义的。这是我的密码:

df2 = pd.read_table(expAtoms,delimiter = " ", header = None)
df2.rename(columns={0:"atom",1:"value"}, inplace=True)
df2.groupby('atom').value.mean()

for atom in df2.atom.unique():
    ppm = df2.where(df2.atom==atom).value.dropna()
    peakAvg = ppm.mean()
    getQMulti(ppm,peakAvg,errorLim)

获取peakAvg的方法是从文本文件读入,获取特定的值(这就是ppm)。根据这些值,我按名称对它们进行分组(这就是atom)。但是,peakAvg是通过取所有ppm值(即数字)并按组取其平均值(atom)生成的

变量peakAvg看起来像这样(即:如果我打印peakAvg的值,它看起来像这样):(这只是一个片段,但最后一个数字是列表中实际的最后一个数字)

5.14823 
7.70533666667
5.69855333333
7.5981
5.79998333333
8.09575666667
7.4699025
7.60002

在上面的循环中,我调用我的函数getQMulti 我想将我的变量peakAvg用于我创建的另一个名为getQPred的函数。这就是我的第二个循环(我称之为getQPred)的样子:

for atom2 in df3.atom2.unique():
    ppm2=df3.where(df3.atom2==atom2).value2.dropna()
    getQPred(ppm2,peakAvg)

现在如果我打印出peakAvg是什么,我只得到一个数字的列表(这只是一个片段,但整个列表就是这个数字):

7.60002
7.60002
7.60002
7.60002
7.60002
7.60002
7.60002
7.60002

我怎样才能使我的peakAvg变量成为它以前的样子(即:我拥有的第一个数字列表),因为现在我调用我的函数getQPred时得到的结果不准确。你知道吗

编辑:以下是我正在使用的函数:

SQRT2 = math.sqrt(2.0)
ERRMUL=2.0

errorLim = 0.3
sigma = 0.5

def getQ(x):
    q = np.log(1.0-erf(np.absolute(x)/SQRT2))
    return q
def getQMulti(ppm,peakAvg,errorLim):
    x=(ppm-peakAvg)/errorLim
    q= getQ(x)
    x0 = 2.0
    q0 = getQ(x0)
    QMulti = 1.0+(q/np.absolute(q0))   
    return QMulti
def getQPred(ppm,peakAvg):
    x = (ppm-peakAvg)/sigma
    q = getQ(x)
    x0 = 1.5
    q0 = getQ(x0)
    QPred = 1.0+(q/np.absolute(q0))
    return QPred

Tags: 函数列表valuenp数字atomdf2ppm
1条回答
网友
1楼 · 发布于 2024-10-02 18:15:35

在您的代码中,peakAvg不是一个列表,它是一个值,每次通过循环都会更改。你知道吗

方法如下:

peakAvg_list = []
for something in whatever:
    do_something_with_ppm
    peakAvg = ppm.mean()
    peakAvg_list.append(peakAvg)
    do_something_with_peakAvg 

也就是说,首先将peakAvg_List初始化为空列表,然后每次通过该列表时,appendpeakAvg的新值初始化为该列表。这样,peakAvg_list就包含了你想要的东西的整个列表,如果你想要的话,你可以return。你知道吗

如果要对列表做进一步的操作,可以执行另一个循环:

for peakAvg in peakAvg_List:
    x = (ppm - peakAvg)/sigma
    ### do something with x

但是您需要弄清楚这段代码的最终输出/目标应该是什么。你想要一个你正在计算的所有QPred数量的列表吗?或者你需要把它们收集成一个单一的数字?这里的答案取决于您实际要做什么,这与Python语法是分开的。。。你知道吗

另外,如果您对在各种列表的所有元素上执行相同的操作感兴趣,那么您应该了解numpy。(更一般地说,您可能需要了解Python中的列表和循环,它们是非常基本的概念,因此您可能需要从官方的Python tutorial之类的内容开始。你知道吗

相关问题 更多 >