for循环设置只打印唯一的字典项

时间:2014-10-07 02:28:16

标签: python for-loop dictionary set

我已经定义了一个从文件读入的字符串

str = """foo\t1039|1736|t3958\n
frombric\t1039\n
bonn\t\n"""

我希望这样输出:

1039\tfoo
1736\tfoo
3958\tfoo

注意,重复基因(1039)仅输出一次,与第一次出现的描述相关联。另请注意,可能没有与描述符相关的数字(基因)(在这种情况下为bonn)

我的方法是将基因作为字符串列表冗余地添加到字典中,同时还保留一组基因,我最终用它来为中的每个键提取基因环。 据我所知,下面的代码必须导致只有唯一基因的外印,因为循环的最终迭代集合中的唯一值。然而,虽然事情正在运行,我得到了我想要的输出形状,但我很困惑为什么它似乎并不总是这个列表只包含UNIQUE基因的情况..

for filename in fileList:
f = open("filename")
data = f.readlines()    
    uniquegene = set()
    d = defaultdict(list)

    for line in data:
       parts = line.split('\t')
       desc = parts[0]
       try: 
          genes = parts[1].split('|')
          d[desc] += genes
          for gene in genes:
             uniquegene.append(i)
       except IndexError:
          print " there are no genes on this line"

   result=""
   for u in uniquegene:
        result += "%s\t%s\t%s\n" % (u, filename [key for key in d if u in d[key]])
   print result

我真的很感激帮助我找到我的错误。 (上面的代码比我的代码简化了一点)。谢谢。

1 个答案:

答案 0 :(得分:0)

我不太明白为什么你要保留一组独特的基因,以及描述符的字典到基因列表。我想你想要做的是建立一个Descriptor字典 - >一组基因,除非你还需要维护一个字典,其中包含每个描述符所有基因出现的完整有序列表:

d = defaultdict(set)

for line in data:
   parts = line.split('\t')
   desc = parts[0]
   try: 
      genes = parts[1].split('|')
      for gene in genes:
         d['desc'].add(gene)
   except IndexError:
      print " there are no genes on this line"

如果您需要维护完整(非唯一)字典,那么我会将其保留为您的真实数据表示,并在输出时过滤结果:

for k,v in d.iteritems():
    for g in set(v):
        result += "%s\t%s\n" % (g, k)
print result