Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于设置为仅打印唯一字典项的循环_Python_For Loop_Dictionary_Set - Fatal编程技术网

Python 对于设置为仅打印唯一字典项的循环

Python 对于设置为仅打印唯一字典项的循环,python,for-loop,dictionary,set,Python,For Loop,Dictionary,Set,我已经定义了从文件中读入的字符串 str = """foo\t1039|1736|t3958\n frombric\t1039\n bonn\t\n""" 我希望输出如下内容: 1039\tfoo 1736\tfoo 3958\tfoo 注意,重复基因1039仅输出一次,与第一次出现的描述相关联。还请注意,在这种情况下,可能没有与描述符相关的数字基因 我的方法是将多余的基因作为字符串列表添加到字典中,同时维护一组基因,我最终使用这些基因来提取for循环中每个键的基因。 根据我的说法,下面的代

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

str = """foo\t1039|1736|t3958\n
frombric\t1039\n
bonn\t\n"""
我希望输出如下内容:

1039\tfoo
1736\tfoo
3958\tfoo
注意,重复基因1039仅输出一次,与第一次出现的描述相关联。还请注意,在这种情况下,可能没有与描述符相关的数字基因

我的方法是将多余的基因作为字符串列表添加到字典中,同时维护一组基因,我最终使用这些基因来提取for循环中每个键的基因。 根据我的说法,下面的代码必须只输出唯一的基因,因为最终的for循环会在集合中的唯一值上迭代。然而,虽然事情正在进行,我得到了我想要的输出形状,但我很困惑,为什么列表中似乎并不总是只包含独特的基因

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

我真的很感激你能帮我找到我的bug。上面的代码比我的代码简化了一点。谢谢。

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

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

我忘记了d[desc]+=基因这一行;将其添加到脚本中。谢谢。这有什么意义吗。。?我开始怀疑我上一次的列表理解是否有意义——我想要的是:给我字典中作为字典值列表中的值出现的集合中的每一项的键……当我这样运行它时,我得到了ValueError:for k,v in d:语句中的值太多,无法解包。你和我的代码的不同之处在于,我将基因作为一大串字符串添加到字典中,而在你的例子中,基因是一个接一个添加的——如果我理解的话。。这有区别吗?谢谢。@user3524881呸,对不起-在迭代python指令时犯了我通常犯的错误。现在已更正,但它应该在d.iteritems:中读取k,v。抱歉,谢谢,我想我早就试过了。这不会给出所需的输出。我的结果是,我最终得到了一个巨大的文件,其中许多基因被重复多次,描述出现在不同的行上,除了一行作为列表。我不再有任何问题了,尽管我想更好地理解为什么会发生这种情况。谢谢