如何使用我先前在循环(列表)中为单独函数定义的变量?

时间:2017-10-02 16:37:31

标签: python loops

我有一个正在阅读的文本文件,我创建了两个名为ppmpeakAvg的变量。 peakAvg是我想要重用的变量,它是在循环中定义的。这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

在您的代码中,peakAvg 不是列表,它是每次循环时都会更改的单个值。

执行此操作的方法如下:

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

即,首先将peakAvg_List初始化为空列表,然后每次通过列表append将新值peakAvg添加到列表中。这样,peakAvg_list包含您想要的所有内容列表,如果需要,您可以return

如果您想对列表做进一步的操作,可以再做一次循环:

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

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

另外,鉴于您有兴趣对各种列表的所有元素执行相同的操作,您应该了解numpy。 (更一般地说,您可能需要了解Python中的列表和循环,这是非常基本的概念,因此您可能希望从官方Python tutorial开始。