我有一组50个文本文件,所有文件都设置有第一标题行,第一列是基因名称,其余列是每个基因的值。我也有一个官方的基因列表文本文件。我想使用正式的基因名称列表来构建字典,然后遍历文件,确定每一行的基因名称是否与字典中的基因名称匹配,如果匹配,请在字典值后附加来自实验文件。
实验文件如下:
GENE Exp1 Exp2
geneA 12 34
geneB 42 10
geneC 42 10
官方基因列表如下:
GENE
geneA
geneC
我尝试使用defaultdict和以下代码(仅适用于一个实验文件,但稍后可能会迭代更多内容):
combo = {}
with open('official_gene_list.txt', 'r') as f:
f.readline()
for line in f:
name = line.split('\n')[0]
combo[name]={}
with open('expeirmenta1_file.txt', 'r') as g:
for each in g:
name2 = each.split('\t')[0]
data = each.rstrip('\n').split('\t')[1:]
for name2 in combo:
combo[name2].append(data)
但是每当我这样做时,字典就没问题了,但是出现以下错误:
AttributeError: 'dict' object has no attribute 'append'
我也尝试使用defaultdict():
from collections import defaultdict
combo = defaultdict(list)
with open('gene_orf_updated2.txt', 'r') as f:
f.readline()
for line in f:
name = line.split('\n')[0]
combo[name]={}
with open('GSE139_meanCenter_results.txt', 'r') as g:
for each in g:
name2 = each.split('\t')[0]
data = each.rstrip('\n').split('\t')[1:]
for name2 in combo:
combo[name2].append(data)
我也收到关于“ dict”对象没有属性“ append”的相同错误。
我之前做过字典,但是从未尝试过将新值附加到现有的键上。这可能吗?任何帮助或建议,将不胜感激。
答案 0 :(得分:0)
因此,如果要使用.append()
,则需要确保要附加的字典值是一个列表。似乎您将其设置为combo[name]={}
,因此您收到“字典没有属性”错误。您可能应该尝试将combo[name]={}
更改为combo[name]=[]
,以便以后继续使用附加。
新的Edit修复逻辑:
for each in g:
# name2 = each.split('\t')[0]
data = each.rstrip('\n').split('\t')[1:]
for key_name in combo: # For every 'value' (each individual list) in the dictionary
combo[key_name].append(data) # Add the this lines data.
答案 1 :(得分:0)
你很亲密,像这样
combo = {}
with open('gene_orf_updated2.txt', 'r') as f:
for line in f:
name = line.split('\n')[0]
combo[name]= []
with open('GSE139_meanCenter_results.txt', 'r') as g:
for each in g:
name2 = each.split('\t')[0]
data = each.rstrip('\n').split('\t')[1:]
if name2 in combo:
combo[name2].append(data)
如果要删除嵌套列表,请执行此操作。
combo[name2] += data
答案 2 :(得分:0)
正如其他人指出的那样,您不能附加字典。
d = {}
初始化字典后,您可以像这样添加新键
d['new'] = 9
您可以通过此操作覆盖现有密钥
d['new'] = 10
在您遇到的情况下,您可能想要尝试创建列表字典,然后将其追加。
答案 3 :(得分:0)
import pandas as pd
def print_file(f_name):
print('\n\n'+f_name)
print('*'*10)
print(open(f_name,'r').read())
gene_fname = 'genes.txt'
print_file(gene_fname)
gene = pd.read_csv(gene_fname)
df_final = pd.DataFrame(gene)
df_final['combined'] = [list() for x in range(len(df_final.index))]
for val in ['values1.txt','values2.txt','values3.txt','values4.txt']:
print_file(val)
val_df = pd.read_csv(val,header=0,delim_whitespace=True)
df_final = pd.merge(df_final,val_df,on='GENE',how='left')
df_final['new'] = df_final.loc[:,df_final.columns.difference(['GENE','combined'])].values.tolist()
df_final['combined'] = df_final['new']+df_final['combined']
df_final.drop(df_final.columns.difference(['GENE','combined']),1,inplace=True)
df_final['combined'] = df_final['combined'].apply(lambda x: [int(i) for i in x if str(i) != "nan"])
print('\n\n')
print(df_final)