【问题标题】:Python appending to the same row in the listPython追加到列表中的同一行
【发布时间】:2020-12-03 18:09:39
【问题描述】:

我编写了一段代码,用于搜索文本文件的目录,并根据我编写的 if 条件,复制、存储和写入新文件。我正在努力解决的问题是,当不同的 if 条件附加到同一个空列表时,它将第二个“if 条件”的输出存储为一个新的元素数组。但是,我希望将多个 if 条件的输出存储在同一行中。在这里更具体地说是我的代码如何在文本文件中存储和写入。

import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.optimize import curve_fit
from IPython import embed

import os

File = 'results.txt'
ospath = os.walk('/Users/analyses/')

mylist=[]

for subdir, dirs, files in ospath:
    if File in files:
        filepath = subdir + '/' + File
        with open(filepath) as fp:
            for line in fp:
                line_list = []
                if "Bckgnd subtracted source c/r" in line:
                    line_array = line.split(" ")
                    mylist.extend((line_array[5],line_array[7].rstrip("\n")))
                elif "Bckgnd subtracted source cnts" in line:
                    line_array = line.split(" ")
                    mylist.extend((line_array[5],line_array[7].rstrip("\n")))
                mylist.append(line_list)

mylist = np.asarray(mylist)


with open("mylist.txt", "w") as txt_file:
    for line in mylist:
        txt_file.write('\n'.join(','.join(elems) for elems in mylist))

输出:

    11.3,4.8
    id_06,BANANA
    9.3,5.6
    id_01,APPLE
    8.7, 23.8
    id_08, ORANGE
    
    mylist[0] = [11.3,4.8] #comes from first if condition
    mylist[1] = [id_06,BANANA] #comes from second if condition

我想要的方式:

    11.3,4.8,id_06,BANANA 
    9.3,5.6,id_01,APPLE
    8.7, 23.8, id_08, ORANGE

在哪里mylist[0] = [11.3,4.8,id_06,BANANA]

【问题讨论】:

  • 尝试使用 ifelif 语句而不是两个 if 语句,因为这样一次只会激活一个条件,即使两个条件都满足。
  • 我得到了与 elif 相同的结果。
  • 你确定你的缩进没问题吗?您提供的示例中 mylist.append 语句超出了 if 块等内容。

标签: python arrays python-3.x list numpy


【解决方案1】:

不完全确定它是否适合您的问题。但您可以尝试以下方法:

mylist = []
with open(filepath) as fp:
    for line in fp:
        line_list = []
        if "condition1" in line:
            line_array = line.split(" ")
            line_list.extend([line_array[5],line_array[7].rstrip("\n")])
        if "condition2" in line:
            line_array = line.split(" ")
            line_list.extend((line_array[5],line_array[7].rstrip("\n")))
        mylist.append(line_list)

mylist = np.asarray(mylist)

这对每行使用一个单独的列表,该列表被扩展为产生一个列表而不是列表列表,因为它会在附加数据时发生。每一行的列表都会被清除。 这可能不是最快或最优雅的方法,但它应该可以解决您的问题。

【讨论】:

    【解决方案2】:

    您的示例代码中的几行缩进看起来可能是错误的——似乎for line in fp: 行应该少缩进一级,mylist.append(...) 行应该多缩进一级。

    关于您的问题:如果我的理解正确,您希望 mylist.txt 文件中同一行的两个 if 条件中的 line_array 。假设是这种情况,请尝试使用array.extend(...)

    with open(filepath) as fp:
        for line in fp:
            line_array = []
            if "condition1" in line:
                line_array = line.split(" ")
                mylist.extend([line_array[5],line_array[7].rstrip("\n")])
            if "condition2" in line:
                line_array = line.split(" ")
                mylist.append([line_array[5],line_array[7].rstrip("\n")])
    

    【讨论】:

    • 这可能会导致问题,当第一个条件满足时,第二个条件不满足。在这种情况下,mylist 可能会被扩展两次并且维度错误。
    • 我假设 OP 中存在两个 if 块,只满足一个条件是可以接受的,并且列表中每一行的长度会有所不同。如果两个条件都必须满足,那么肯定应该将它们简化为单个条件(或嵌套条件)吗?也许需要进一步澄清。
    • 是的,这两种情况肯定会发生,对于这种情况和@FabianZills 的建议,我都得到了错误的结果。在这两种情况下,我都会得到一堆空列表,所以它是 20 个空元素数组,条件 1 中的一行,条件 2 中的一行,以及 20 个空元素,然后是另一个文本文件的结果。
    • 看不到文件路径的内容,可能无法调试,但空白列表表示不满足条件。最初情况并非如此,因为您的数组附加发生在 if 块之外(由于缩进问题)。
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2013-11-08
    • 2021-12-26
    • 2017-03-18
    • 1970-01-01
    • 2020-08-08
    • 2021-01-10
    • 2020-05-05
    相关资源
    最近更新 更多