2011-07-27 18 views
0

私はこの問題をしばらく取り組んできましたが、誰かが助けてくれることを望んでいます。私は、transcripts_test.csvと呼ばれるcsvファイルの列[1]を繰り返し処理しようとしています。行[1]の各文字列は、coors_test.csvという別のcsvファイルからOCR_dictという辞書を作成しています。困惑辞書一致問題

transcripts_test.csvは含まれています

ENST00000347869,chr3,50126341,50156454,1  
ENST00000452166,chr14,21679063,21737583,2 
ENST00000452166,chr14,21679063,21737583,2 

coors_test.csvは含まれています

chr3,141030221,141031065,Valid_10009,1000,+ 
chr6,141030221,141031065,Valid_10005,1000,+ 
chr14,141047080,141047610,Valid_10006,1000,+ 

これは私のコードです:

import csv 

with open('coors_test.csv', mode='r') as coors_infile: 
    coors_reader = csv.reader(coors_infile) 
    for row in coors_reader: 
      chromo = row[0] 
      start = row[1] 
      end = row[2] 
      coordinates_list = [chromo,start,end] 
      OCR_dict = {row[3]:coordinates_list} 
      for keys,values in OCR_dict.items(): 
       OCR_chromosome = values[0] 
    with open('transcripts_test.csv', mode='r') as transcripts_infile: 
     transcripts_reader = csv.reader(transcripts_infile) 
     for row in transcripts_reader: 
      transcript_chromosome = row[1] 
      if transcript_chromosome == OCR_chromosome: 
       print(transcript_chromosome, keys, OCR_chromosome) 

私は上記のコードを実行すると、出力I取得する:

chr14 Valid_10006 chr14 
chr14 Valid_10006 chr14 

私が探しています出力は、次のとおりです。

chr3 Valid_10009 chr3 
chr14 Valid_10006 chr14 
chr14 Valid_10006 chr14 

ないのはなぜ私のコードの一致と印刷chr3 Valid_10009 chr3?どんな助けでも大歓迎です。ありがとう!

 coordinates_list = [chromo,start,end] 
     OCR_dict = {row[3]:coordinates_list} 
     for keys,values in OCR_dict.items(): 
      OCR_chromosome = values[0] 

が、それはすべての反復で新しい辞書を作成し、その辞書が1つだけのキーを持っています

答えて

2

これは、あなたが望むものではありません。その後、1つの項目をループし、ローカル変数を変更するには...あなたが欲しい

はもっとこのように、おそらくです:

from collections import defaultdict 
OCR_dict = defaultdict(list) 

with open('coors_test.csv', mode='r') as coors_infile: 
    coors_reader = csv.reader(coors_infile) 
    for row in coors_reader: 
     chromo = row[0] 
     start = row[1] 
     end = row[2] 
     # OCR_dict is a mapping `chromo -> [(start,end), (start,end), ...]` 
     OCR_dict[chromo].append((start,end)) 

with open('transcripts_test.csv', mode='r') as transcripts_infile: 
    transcripts_reader = csv.reader(transcripts_infile) 
    for row in transcripts_reader: 
     transcript_chromosome = row[1] 
     # look that chromosome up in the dict and print it if it exists 
     if transcript_chromosome in OCR_dict: 
      print(transcript_chromosome, OCR_dict[transcript_chromosome]) 
+0

感謝を。私はあなたが言っていることを理解していると思います。上記のコードを実行しようとしましたが、何も印刷されません。どんなアイデアであっても問題ではありません。助けを前にありがとう! – drbunsen

+0

問題は、辞書の値が3つの項目のリストであると思います。私は思っていません:wtranscript_chromosomeは、リスト内の項目と一致することができます。 – drbunsen

+0

@ dr.bunsen:アイテムは、値ではなくキーで見つけられます。あなたが辞書の中の何かに合っていたいなら、それを鍵として使う必要があります。しかし、私はそれが正しいと思います、 'chr3'などは一致するキーのように見えます。 –

0

OCR_chromosomeが遭遇だchromoの最後の値に設定されています。つまり、OCR_chromosomeはcoors_test.csvの最後の行の最初の値になります。 chr14は一致する唯一の値になります。私はあなたが行っている正確に何ポジティブないんだけど、これはあなたが探しているchromo値を生成する必要があります助けを

import csv 

chromos = set() 
with open('coors_test.csv', mode='r') as coors_infile: 
    for row in csv.reader(coors_infile): 
      chromo = row[0] 
      chromos.add(chromo) 
    with open('transcripts_test.csv', mode='r') as transcripts_infile: 
     for row in csv.reader(transcripts_infile): 
      transcript_chromosome = row[1] 
      if transcript_chromosome in chromos: 
       print transcript_chromosome