0

这些委员会的新手,了解有协议,任何批评都值得赞赏。几天前我已经开始进行 python 编程,并且正在努力追赶。该程序的基础是读取文件,将特定出现的字符串转换为文档中位置的字典。问题比比皆是,我会采取所有的回应。

这是我的代码:

f = open('C:\CodeDoc\Mm9\sampleCpG.txt', 'r')
cpglist = f.read()
def buildcpg(cpg):
    return "\t".join(["%d" % (k) for k in cpg.items()])

lookingFor = 'CG'
i = 0
index = 0
cpgdic = {}
try:
    while i < len(cpglist):
        index = cpglist.index(lookingFor, i)
        i = index + 1
        for index in range(len(cpglist)):
            if index not in cpgdic:
                cpgdic[index] = index
        print (buildcpg(cpgdic))
except ValueError:
    pass
f.close()

cpgdic 应该充当在索引中获得的位置参考的字典。每次读取索引都应该输入 cpgdic 作为新值,并且打印 (buildcpg(cpgdic)) 是我对逻辑失败的预感。我相信(??)它将cpgdic传递给buildcpg函数,它应该作为'CG'的所有位置的输出返回,但是出现错误“TypeError:不是所有参数在字符串格式化期间转换”。到你了!

附言。这会破坏我的 2GB 内存;我需要通过更多阅读来提高

4

1 回答 1

2

cpg.items正在产生元组。因此,kis a tuple(length 2) 然后您尝试将其格式化为单个整数。


[附带说明一下,如果您将and]放在join一行中,您可能会更节省内存。这会将您的列表理解转换为更好的生成器表达式。如果你在 python2.x 上,你可以使用cpg.iteritems()代替cpg.items()来节省一点内存。


存储键和值相同的字典也没有什么意义。在这种情况下,一个简单的列表可能更优雅。我可能会这样写代码:

with open('C:\CodeDoc\Mm9\sampleCpG.txt') as fin:
     cpgtxt = fin.read()

indices = [i for i,_ in enumerate(cpgtxt) if cpgtxt[i:i+2] == 'CG']
print '\t'.join(indices)

这是在行动:

>>> s = "CGFOOCGBARCGBAZ"
>>> indices = [i for i,_ in enumerate(s) if s[i:i+2] == 'CG']
>>> print indices
[0, 5, 10]

注意

i for i,_ in enumerate(s)

i for i in range(len(s))

除了我不喜欢range(len(s))和以前的版本可以使用任何可迭代的——不仅仅是序列。

于 2013-01-25T19:33:53.220 回答