Как добавить вложенные списки в список во время выполнения цикла Python? - PullRequest
0 голосов
/ 22 января 2019

У меня есть функция, которая перебирает файлы, выполняет некоторые операции и в конце сохраняет их в виде списка списков.Я сделал это в R, и теперь я пытаюсь передать его на Python.Мой текущий Код выглядит следующим образом:

def read_raw_spec(infile):
## to be filled later
rw_spec =  []
## loop over all files
for file in infile:
    ## Extract metadata
    with open(file, "r") as f:
        lines = f.readlines()[0:38]
        element = str(lines[11][(lines[11].find(":")+2):(len(lines[11])-1)])
        edge = str(lines[10][(lines[10].find(":")+2):(len(lines[10])-1)])
        E_zero_load = float(lines[12][(lines[12].find(":")+2):(len(lines[12])-1)])
        filename = str([os.path.basename(file)])
        rw_specdat = pd.read_csv(file,delim_whitespace = True, skiprows = 39,  engine = "python")
        rw_specdat = rw_specdat.loc[:,'#':'e']
        rw_specdat = (rw_specdat.rename(index=str, columns={"#":"Energy", "e":"raw_abs"}), E_zero_load)
        rw_spectemp = [{'name':filename, 'element' : element, 'edge' : edge, 'data' : list(rw_specdat)}]

        if rw_spec is None: 
            rw_spec = rw_spectemp
        else:
            rw_spec = rw_spec.append(rw_spectemp)
return rw_spec

Тем не менее, когда я запускаю Код, он берет только последний элемент и добавляет его в список.Когда я ожидал бы несколько вложенных списков, из каждого файла.Этот подход работает с пандами, но угадывает списки, добавляющиеся, когда циклы отличаются?

1 Ответ

0 голосов
/ 22 января 2019

В python list.append() является операцией и поэтому возвращает None.

if rw_spec is None: 
    rw_spec = rw_spectemp
else:
    rw_spec = rw_spec.append(rw_spectemp)
    # This makes rw_spec None

Предположительно, у вас есть четное количество файлов, что приводит к тому, что вторая последняя итерация делает rw_spec Нет, затем на последней итерации rw_spec присваивается rw_spectemp последнего файла, который возвращается.

В отличие от list, pandas.DataFrame.append возвращает appended DataFrame, а не None. Таким образом переназначение работает.

Простое изменение указанного выше чанка, как показано ниже, решит проблему:

if rw_spec is None: 
    rw_spec = rw_spectemp
else:
    rw_spec.append(rw_spectemp)
    # This makes rw_spec None
...