Свести вложенный список в плоский список, содержащий строки - PullRequest
0 голосов
/ 24 октября 2019

Создание словаря:

У меня есть набор из 50 текстовых файлов, все из которых настроены на первую строку заголовка, первый столбец - имена генов, а остальные столбцы - значения для каждого гена. У меня также есть официальный текстовый файл со списком генов. Я хочу использовать официальный список имен генов для создания словаря, затем перебрать файлы, определить, совпадает ли имя гена для каждой строки с именем гена в словаре, и, если это так, добавить значение словаря с дополнительными значениями изэкспериментальный файл.

Итак, экспериментальный файл выглядит следующим образом:

Gene_ORF    ExpA    ExpB
geneA   12      34
geneB   42      10
geneC   42      10

Официальный список генов выглядит так:

Gene_ORF    
geneA   
geneC

Я использовал следующий код дляпереберите все файлы в каталоге и создайте словарь:

dict = {}

df_list_all = [ fn for fn in os.listdir(os.getcwd()) if fn.endswith("results.txt") ]

with open("gene_orf.txt", 'r') as f:
        for line in f:
            name = line.split('\n')[0]
            dict[name]= []

for each in df_list_all:
    with open(each, 'r') as g:
        for each in g:
            gene = each.split('\t')[0]
            data = each.rstrip('\n').split('\t')[1:]
            if gene in dict:
                dict[gene].append(data)

Итак, словарь выглядит следующим образом:

{ 'Gene_ORF': [['ExpA', 'ExpB'], ['ExpC']], 'geneA': [['12, '34'], ['42']]...}

Я использовал следующий код для преобразования словаря во вложенныйlist:

nestedList = [ ]
for key, val in dict.items():
    nestedList.append(f"{key} \t {val} \n")

В результате получился вложенный список, составленный следующим образом:

"Gene_ORF \t [['ExpA', 'ExpB'], ['ExpC']] \n GeneA \t [['12', '34'], ['42']] \n"

Я пытаюсь сгладить вложенный список, но запускаю его для решения проблем, связанных сструны. Я пробовал несколько вещей, в том числе:

flatList = ' '.join([data for ele in nestedList for data in ele])

и

flatList = []
for elem in nestedList:
    flatList.extend(elem)

Но каждый раз я получаю такой результат:

O R F _ G e n e   \t.  [ [ ' E x p A ' , ' E x p B ' ] , [ ' E x p C ' ] ]   \n

I 'мне бы хотелось, чтобы flatList выглядел так:

Gene_ORF \t ExpA \t ExpB \t ExpC
GeneA \t 12 \t 34 \t 42

Потому что я хотел бы написать все это в финал, чтобы он выглядел так:

Gene_ORF    ExpA    ExpB    ExpC
GeneA       12      34      42

Я бы очень признателенлюбая помощь или совет, который у вас есть.

РЕДАКТИРОВАТЬ: отредактировано, чтобы указать, как я вошел в первый список.

1 Ответ

0 голосов
/ 24 октября 2019

Я понял, как решить мою проблему, и хотел опубликовать решение на случай, если оно поможет кому-нибудь еще в будущем.

Я использовал следующий код для записи словарных ключей и значений в список,где значения разделены вкладками, затем отсортируйте список и запишите все это в файл (моя конечная цель):

combined = [ ]
for key, val in dict.items():

    #this should flatten the nested list that makes up the values
    val2 = [val for sublist in combo[key] for val in sublist] 

    #separate the flattened list of values with tabs
    val3 = "\t".join(val2) 

    #write each key and value to a list with new lines at the end of the values
    combined.append(f"{key}\t{val3}\n") 

    #sort the list starting at the second row, leaving the header first
    combined[1:] = sorted(combined[1:]) 

#write each line to a text file
with open("final.txt", 'w') as f:
    for each in combined:
        f.write(each) 

Я уверен, что есть другие способы улучшить этот код, но этокажется, работает на меня.

...