制作字典:
我有一组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
如果您有任何帮助或建议,我将非常感谢。
编辑:进行编辑以表明我是如何制作嵌套列表的。
答案 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)
我确定还有其他方法可以改进此代码,但它似乎对我有用。