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:文字列フォーマット中に変換されたすべての引数ではありません」というエラーが表示されます。あなたの番!

ps。これにより、2GBのメモリが破壊されます。私はもっ​​と多くの読書で改善する必要があります

4

1 に答える 1

2

cpg.itemsタプルを生成しています。そのため、ktuple(長さ2)であり、それを単一の整数としてフォーマットしようとしています。


ちなみに、とを省略した方が、メモリ効率が少し向上する可能性があり[ます。これにより、リスト内包表記が少し優れたジェネレータ式に変わります。python2.xを使用している場合は、代わりに使用してメモリを少し節約することもできます。]joincpg.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 に答える