迭代文件并向python字典添加值
我有一组50个文本文件,所有文件都设置了第一个标题行,第一列是基因名称,其余列是每个基因的值。我还有一个正式的基因列表文本文件。我想使用官方的基因名称列表来构建一个字典,然后迭代文件,确定每行的基因名称是否与字典中的基因名称匹配,如果匹配,则将字典值与实验文件中的附加值相加 因此,实验文件如下所示:迭代文件并向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
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
。如果编辑仍然不是你正在寻找让我知道,我会修复它,并解释如何得到你想要的。