0

10 個のデータ ファイルを取得し、それらを 1 行ずつ読み取り、ファイル内の最初の (遺伝子) 項目と 3 番目の (値) 項目の辞書を作成し、これらすべてを 1 つの出力ファイルに結合するスクリプトを作成しようとしています。 10 回の反復の平均を示す 12 列目。(これをいくつかの異なるサンプルに対して行い、それぞれ 10 回の複製を行います。) for ループと range 関数を使用して、ファイル名、辞書名などを自動的に生成しようとしています。辞書を作成するコードを 10 回書き出すよりも仕事をする方法。しかし、私はコーディングが初めてで、コードの 11 行目 ('gene{0}key'.format(i) = []) で「SyntaxError: can't assign to function call」というメッセージが引き続き表示されます。同じように構造化された他のいくつかのコード行に対しても同じことが行われます。誰かが私が間違っていることを知っているなら、それが何であるか知りたいです! 前もって感謝します!

#!/usr/bin/env ipython

import re
import itertools
import numpy

sample = raw_input('sample: ')

for i in range(10):
    filename = sample+'_rand{0}.genes.tajD'.format(i)
    'gene{0}key'.format(i) = []
    'taj{0}value'.format(i) = []
    with open(filename, 'r') as data:
        for line in data:
            line = line.strip().split('\t')
            gene, taj = line[0], line[3]
            'gene{0}key'.format(i).append(gene)
            'taj{0}value'.format(i).append(taj)
    'dic{0}'.format(i) = dict(itertools.izip('gene{0}key'.format(i),'taj{0}value'.format(i)))

outfilename = sample+'_tajD.genes.all'

with open(sample+'_rand0.genes.tajD', 'r') as genes, open(outfilename, 'w') as outfile :
    for line in genes :
        line = line.strip().split('\t')
        mastergene = line[0]
        for i in range(10):
            'value{0}'.format(i) = 'dic{0}'.format(i)[mastergene]
        allrand = [value0, value1, value2, value3, value4, value5, value6, value7, value8, value9]
        avg = numpy.mean(allrand)
        outfile.write(mastergene + '\t' + value0 + '\t' + value1 + '\t' + value2 +'\t' + value3 + '\t' + value4 + '\t' + value5 + '\t' + value6 + '\t' + value7 + '\t' + value8 + '\t' + value9 + '\t' + avg + '\n')
4

1 に答える 1

3
'gene{0}key'.format(i) = []

これは、新しいコーダーが使おうとする典型的なアンチパターンです。、 、 などの名前gene1keyで10 個の変数を作成したいとします。これを行う正しい方法は、リストまたは辞書を使用することです。これをキーとして使用してインデックスを作成します。構文的に正しいようにコードを書き直す最も簡単な方法は次のとおりです。gene2keygene3keyi

genekeys = {}
tajvalues = {}
dictionaries = {}

for i in range(10):
    filename = sample+'_rand{0}.genes.tajD'.format(i)
    genekeys[i] = []
    tajvalues[i] = []
    with open(filename, 'r') as data:
        for line in data:
            line = line.strip().split('\t')
            gene, taj = line[0], line[3]
            genekeys[i].append(gene)
            tajvalues[i].append(taj)
    dictionaries[i] = dict(itertools.izip(genekeys[i],tajvalues[i]))


with open(sample+'_rand0.genes.tajD', 'r') as genes, open(outfilename, 'w') as outfile :
    for line in genes :
        values = {}
        line = line.strip().split('\t')
        mastergene = line[0]
        for i in range(10):
            values[i] = dictionaries[i][mastergene]
        allrand = [values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9]]
        avg = numpy.mean(allrand)
        outfile.write(mastergene + '\t' + values[0] + '\t' + values[1] + '\t' + values[2] + '\t' + values[3] + '\t' + values[4] + '\t' + values[5] + '\t' + values[6] + '\t' + values[7] + '\t' + values[8] + '\t' + values[9] + '\t' + avg + '\n')

コードはさらに単純化できます。たとえば、genekeys と tajvalues は を作成するためだけに使用されるためdictionaries、中間値を保存する必要なく、その dict を直接入力することができます。リストを作成できるので、とvaluesの間にそれぞれを明示的に指定する必要はありません。numpy.meanoutfile.write

dictionaries = {}
for i in range(10):
    filename = sample+'_rand{0}.genes.tajD'.format(i)
    dictionaries[i] = {}
    with open(filename, 'r') as data:
        for line in data:
            line = line.strip().split('\t')
            gene, taj = line[0], line[3]
            dictionaries[i][gene] = taj

with open(sample+'_rand0.genes.tajD', 'r') as genes, open(outfilename, 'w') as outfile :
    for line in genes :
        line = line.strip().split('\t')
        mastergene = line[0]
        values = []
        for i in range(10):
            values.append(dictionaries[i][mastergene])
        #alternative to the above for loop: values = [dictionaries[i][mastergene] for i in range 10]
        avg = numpy.mean(values)
        outfile.write(mastergene + '\t' + '\t'.join(values) + '\t' + avg + '\n')
于 2013-10-04T17:43:28.630 に答える