Загадочная проблема со словарем - PullRequest
0 голосов
/ 27 июля 2011

Я застрял на этой проблеме некоторое время, и я надеюсь, что кто-то может помочь.Я пытаюсь перебрать столбец row [1] в файле csv с именем transcripts_test.csv, и для каждой строки в строке [1] сопоставить одну и ту же строку в словаре, который я создал, под названием OCR_dict из другого файла csv с именем coors_test.csv.

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)

Когда явыполнить код, приведенный выше, вывод, который я получаю:

chr14 Valid_10006 chr14  
chr14 Valid_10006 chr14  

Вывод, который я ищу:

chr3 Valid_10009 chr3  
chr14 Valid_10006 chr14  
chr14 Valid_10006 chr14  

Почему мой код не совпадает и не печатает chr3 Valid_10009 chr3?Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Это не то, что вы хотите:

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

он создает новый дикт в каждой итерации, и этот дикт имеет только один ключ. Затем вы перебираете этот элемент и меняете локальную переменную ...

То, что вы хотите, вероятно, больше похоже на это:

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 голосов
/ 27 июля 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...