【问题标题】:Puzzling dictionary matching problem令人费解的字典匹配问题
【发布时间】:2011-07-27 16:42:11
【问题描述】:

我已经被这个问题困扰了一段时间,我希望有人能提供帮助。我正在尝试遍历名为 transcripts_test.csv 的 csv 文件中的列 row[1],并且对于 row[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)

当我执行上面的代码时,我得到的输出是:

chr14 Valid_10006 chr14  
chr14 Valid_10006 chr14  

我正在寻找的输出是:

chr3 Valid_10009 chr3  
chr14 Valid_10006 chr14  
chr14 Valid_10006 chr14  

为什么我的代码不匹配并打印chr3 Valid_10009 chr3?任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    这不是你想要的:

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

    它在每次迭代中创建一个 new 字典,并且该字典只有一个键。然后循环遍历该项目并更改局部变量...

    你想要的可能更像这样:

    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])
    

    【讨论】:

    • 感谢您的帮助。我想我明白你在说什么。我尝试运行您提供的上述代码,但没有打印。知道可能是什么问题。提前感谢您的帮助!
    • 我认为问题在于字典中的值是三个项目的列表。我不认为 :wtranscript_chromosome 可以匹配列表中的项目。
    • @dr.bunsen:您可以通过键而不是值来查找项目。如果要匹配 dict 中的任何内容,则必须将其用作键。不过我觉得是对的,chr3等貌似是匹配的关键。
    • 衷心感谢您对 Jochen 的帮助。我认为我的主要问题是我不明白如何访问字典中的值。我需要单独对字典值进行一些操作。这有意义吗?
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 2011-07-20
      • 2021-12-05
      相关资源
      最近更新 更多