迭代文件并向python字典添加值

迭代文件并向python字典添加值,python,dictionary,append,defaultdict,Python,Dictionary,Append,Defaultdict,我有一组50个文本文件,所有文件都设置了第一个标题行,第一列是基因名称,其余列是每个基因的值。我还有一个正式的基因列表文本文件。我想使用官方的基因名称列表来构建一个字典,然后迭代文件,确定每行的基因名称是否与字典中的基因名称匹配,如果匹配,则将字典值与实验文件中的附加值相加 因此,实验文件如下所示: GENE Exp1 Exp2 geneA 12 34 geneB 42 10 geneC 42 10 GENE geneA ge

我有一组50个文本文件,所有文件都设置了第一个标题行,第一列是基因名称,其余列是每个基因的值。我还有一个正式的基因列表文本文件。我想使用官方的基因名称列表来构建一个字典,然后迭代文件,确定每行的基因名称是否与字典中的基因名称匹配,如果匹配,则将字典值与实验文件中的附加值相加

因此,实验文件如下所示:

GENE    Exp1    Exp2
geneA   12      34
geneB   42      10
geneC   42      10
GENE    
geneA   
geneC
官方基因列表如下所示:

GENE    Exp1    Exp2
geneA   12      34
geneB   42      10
geneC   42      10
GENE    
geneA   
geneC
我尝试过使用defaultdict和以下代码(仅针对一个实验文件,但稍后可能会迭代更多):

但每当我这样做时,字典都会变得很好,但我得到以下错误:

AttributeError: 'dict' object has no attribute 'append'
我还尝试使用defaultdict():

我得到了关于“dict”对象没有属性“append”的相同错误


我以前制作过字典,但从未尝试像这样将新值附加到现有键。这可能吗?任何帮助或建议都将不胜感激

因此,如果要使用
.append()
,需要确保要附加到的字典值是一个列表。看起来您正在将其设置为
combo[name]={}
,因此会出现“dict has no attribute”错误。您可能应该尝试将
combo[name]={}
更改为
combo[name]=[]
,以便稍后继续使用append

新编辑固定逻辑:

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. 

你和我很亲近,就这样做吧

combo={}
将open('gene_orf_updated2.txt','r')作为f:
对于f中的行:
name=line.split('\n')[0]
组合[名称]=[]
将open('GSE139_meanscenter_results.txt','r')作为g:
对于g中的每一个:
name2=each.split('\t')[0]
data=each.rstrip('\n').split('\t')[1:]
如果组合中的名称2:
组合框[name2]。追加(数据)
如果要删除嵌套列表,请改为执行此操作

combo[name2]+=数据

正如其他人指出的,您不能附加到dicts

d = {}
初始化dict后,可以像这样添加新密钥

d['new'] = 9
通过执行此操作,可以覆盖现有密钥

d['new'] = 10
在您的情况下,您可能希望尝试创建一个列表的目录,然后附加到该目录

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)

我想你把字典和清单搞混了。可以附加到列表,但不能附加到词典。因此,您可能希望用一个空列表作为其值初始化每个键(基因名),然后附加到该列表!这就是我所做的(遵循这一点和其他张贴的建议),它似乎正在按预期工作!谢谢(我正在反向编辑,因为你已经足够棒了,可以回复了)。我把每个数据值都加到组合词中的每个名字上。知道为什么吗?啊,我只是看看你的逻辑,明白你的意思。g:name2=each.split('\t')[0]data=each.rstrip('\n').split('\t')[1:]在combo:combo[name2]中为name2添加一秒钟
。追加(数据)
,因此我在查看代码时有点困惑,因为您使用了两次变量
name2
。如果编辑仍然不是你正在寻找让我知道,我会修复它,并解释如何得到你想要的。