迭代文件并将值添加到 python 字典

Iterating over files and adding values to python dictionary

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

因此实验文件如下所示:

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' object 没有属性 'append' 的相同错误。

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

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

新编辑修复逻辑:

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 = {}

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

正如其他人所指出的,您不能附加到听写。

d = {}

初始化字典后,您可以像这样添加新键

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)

Output