将嵌套列表展平到包含字符串的展平列表

时间:2019-10-23 21:05:05

标签: python string list tabs nested-lists

制作字典:

我有一组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']]...}

我使用以下代码将字典转换为嵌套列表:

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

我希望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 :(得分:0)

我想出了解决问题的方式,并希望发布解决方案,以防将来对其他人有帮助。

我使用以下代码将字典键和值写入列表,其中值由制表符分隔,然后对列表进行排序并将其全部写入文件(我的最终目标):

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) 

我确定还有其他方法可以改进此代码,但它似乎对我有用。