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。抱歉,谢谢,我想我早就试过了。这不会给出所需的输出。我的结果是,我最终得到了一个巨大的文件,其中许多基因被重复多次,描述出现在不同的行上,除了一行作为列表。我不再有任何问题了,尽管我想更好地理解为什么会发生这种情况。谢谢