【问题标题】:Iterating over files and adding values to python dictionary迭代文件并将值添加到 python 字典
【发布时间】:2020-02-19 22:46:54
【问题描述】:

我有一组 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”。

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

【问题讨论】:

  • 我认为您混淆了字典和列表。您可以附加到列表,但不能附加到字典。所以你可能想要的是用一个空列表作为它的值来初始化每个键(基因名称),然后附加到那个列表
  • 谢谢丹!这就是我所做的(按照这个和发布的其他建议),它似乎按预期工作!

标签: python dictionary append defaultdict


【解决方案1】:

你很接近这样做。

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】:

    正如其他人指出的那样,您不能附加到字典。

    d = {}
    

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

    d['new'] = 9
    

    您可以通过这样做覆盖现有的密钥

    d['new'] = 10
    

    在您的情况下,您可能想尝试创建列表的字典,然后附加到该列表中。

    【讨论】:

      【解决方案3】:

      所以如果你想使用.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. 
      

      【讨论】:

      • 谢谢! (我正在撤消编辑,因为您非常棒,可以回复)。我将每个数据值添加到组合字典中的每个名称中。知道为什么吗?
      • 啊,我刚刚看了你的逻辑,明白你的意思。一秒
      • for each in g: name2 = each.split('\t')[0] data = each.rstrip('\n').split('\t')[1:] for name2 in combo: combo[name2].append(data)
      • 所以我看了你的代码有点困惑,因为你使用了变量name2 两次。如果编辑仍然不是您想要的,请告诉我,我会修复它并解释如何获得您想要的。
      【解决方案4】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        相关资源
        最近更新 更多