0

以下のコード スニペットでは、別のインデックスを増やしながら、リスト内の各オブジェクトを反復処理するより Pythonic な方法はありますか? もっと良い方法があると思って、私はこのイディオムを頻繁に使用します。

# Creates a dictionary with normalized values for the dataset.
def exp_pull(sample, gene):
    sample_name = {genes: values for genes, values in 
                    zip([v for i, (j, k) in set_list[int(sample) - 1:int(sample)] 
                    for v in j], mean_values)}
    return round(sample_name.get(gene), 3)


# Pulls normalized expression values for particular genes for all samples.
genes_of_interest = ['ERG', 'ETV1', 'ETV4', 'ETV5']

count = 0
for gene in genes_of_interest:
    print '\n'
    print genes_of_interest[count], ':'
    for file in file_list:
        print file, ": ", exp_pull(file_list.index(file) + 1, 
                                    genes_of_interest[count])
    count += 1    
4

2 に答える 2

4

ループにインデックスを付ける必要はまったくありません。リストにはすでにgene要素があります。代わりに、file_listループのカウンターを取得する必要があり、それが表示され、(高価な)file_list.index()呼び出しを回避します。enumerate()関数を使用すると、次のようになります。

for gene in genes_of_interest:
    print '\n{}:'.format(gene)
    for i, file in enumerate(file_list):
        print '{}: {}'.format(file, exp_pull(i, gene))

これは、文字列フォーマットを使用して、効率的かつコンパクトな方法で出力を結合します。

これで、最初の引数は常に整数になるため、int()呼び出しを でドロップできますexp_pull()また、 から1 つの要素だけをスライスしていたので、インデックス (プラス 1 ではありませんset_list())を渡すことで、過度に複雑なものを次のように単純化できます。file_listexp_pull()

def exp_pull(sample, gene):
    if sample >= len(set_list):
        # no such entry in set_list
        return 0.0
    i, (j, k) = set_list[sample]
    sample_name = dict(zip(j, mean_values))
    return round(sample_name.get(gene, 0), 3)

これにより、ネストされた内包表記の必要性がすべてなくなります。また、通常のデフォルトが返された場合に例外がスローsample_name.get()されるように、呼び出しにデフォルトを追加しました。round()None

あなたのプログラムの残りの部分は、同様の単純化でできると思います。https://codereview.stackexchange.com/に投稿して、他に何が調整できるかを確認してください。

于 2013-09-21T10:33:00.437 に答える
1

あなたが望むように見えますenumerate():

for indx, gene in enumerate(genes_of_interest):
    print '\n'
    print genes_of_interest[indx], ':'
    for indx2, file in enumerate(file_list, 1):
        print file, ": ", exp_pull(indx2, 
                                    genes_of_interest[indx])

しかし、いずれにせよ、これは無意味です。各項目に の名前を付けて、既にリストを反復処理していますgene。単に使用できる場合、インデックスを介してまったく同じ要素にアクセスする必要はありませんgene

for gene in genes_of_interest:
    print '\n'
    print gene, ':'
    for indx, file in enumerate(file_list, 1):
        print file, ": ", exp_pull(indx, 
                                    gene)

enumerate()2 番目の引数startを取ります。0 から開始する代わりに、 nから開始できます。

于 2013-09-21T10:28:26.500 に答える