【问题标题】:Comparison of two elements in different array比较不同数组中的两个元素
【发布时间】:2020-09-08 04:00:13
【问题描述】:

我的问题: 我正在尝试比较来自两个不同数组的两个元素,但运算符不起作用。

有问题的代码片段:

for i in range(row_length):
    print(f"ss_record: {ss_record[i]}")
    print(f"row: {row[i + 1]}")
                
    #THIS IF STATEMENT IS NOT WORKING
    if ss_record[i] == row[i + 1]:
        count += 1
    #print()
    #print(f"row length: {row_length}")
    #print(f"count: {count}")
    if count == row_length:
        print(row[0])
        exit(0)

我做了什么:我尝试在 ss_recordrow 运行之前打印它的值,然后再运行 if 语句,但是当它匹配时,count 不会增加.我尝试将 row 的值存储在一个新数组中,但它出错了,只存储数组长度和行的前 2 个值,并在每个下一个实例重复这些值。

我认为是什么问题:我认为我的代码的问题是从CSV 文件中读取的行并没有被转换为整数,看起来他们相同,但一个是整数,另一个是字符串。

完整代码:

import csv
import sys
import re
from cs50 import get_string
from sys import argv

def main():
    line_count = 0
    if len(argv) != 3:
        print("missing command-line argument")
        exit(1)
    
    with open(sys.argv[1], 'r') as database:
        sequence = open(sys.argv[2], 'r')
        string = sequence.read()
        reader = csv.reader(database, delimiter = ',')

        for row in reader:
            if line_count == 0:
                row_length = len(row) - 1
                ss_record = [row_length]
                for i in range(row_length):
                    ss_record.append(ss_count(string, row[i + 1], len(row[i + 1])))
        
                ss_record.pop(0)
                line_count = 1
            
            else:
                count = 0
                for i in range(row_length):
                    print(f"ss_record: {ss_record[i]}")
                    print(f"row: {row[i + 1]}")
                    
                    #THIS IF STATEMENT IS NOT WORKING
                    if ss_record[i] == row[i + 1]:
                        count += 1
                if count == row_length:
                    print(row[0])
                    exit(0)
  
 
#ss_count mean the # of times the substring appear in the string
def ss_count(string, substring, length):
    count = 1
    record = 0
    pos_array = []

    for m in re.finditer(substring, string):
        pos_array.append(m.start())
    
    for i in range(len(pos_array) - 1):
        if pos_array[i + 1] - pos_array[i] == length:
                count += 1
        else:
            if count > record:   
                record = count
            count = 1
    
    if count > record:   
        record = count
    
    return record
main()

用于重现问题的值:

序列(这是一个文本文件)= AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGGAGGGATAGAAGG

子字符串(这是一个 csv 文件)=
名称,AGATC,AATG,TATC
爱丽丝,2,8,3
鲍勃,4,1,5
查理,3,2,5

CSV 文件的要点: Alice 旁边的数字表示子字符串(STR/Short Tandem Repeat)在字符串(DNA 序列)中连续出现的次数。在这个字符串中,AGATC 连续出现 4 次,AATG 连续出现 1 次,TATC 连续出现 5 次。对于这个 DNA 序列,它与 Bob 匹配并且他作为答案输出。

【问题讨论】:

    标签: python arrays csv cs50


    【解决方案1】:

    你是对的,当你比较 ss_record[i] == row[i + 1]: 有一个类型问题,ss_record 的数字是整数,而行的 数字 是字符串。您可以通过打印ss_recordrow 来确认该问题:

    print("ss_record: {}".format(ss_record)) -> ss_record: [4, 1, 5]
    print("row: {}".format(row)) -> row: ['Alice', '2', '8', '3']
    

    为了让 sn-p 工作,您只需将比较更改为

    ss_record[i] == int(row[i + 1])
    

    也就是说,我觉得该任务的代码相当复杂。 string 类实现了一个count 方法,该方法返回给定子字符串的非重叠出现次数。此外,由于代码以项目为基础工作并且严重依赖于索引操作,因此迭代逻辑很难遵循(IMO)。这是我解决问题的方法:

    import csv
    
    def match_user(dna_file, user_csv):
        with open(dna_file, 'r') as r:
            dna_seq = r.readline()
    
        with open(user_csv, 'r') as r:
            reader = csv.reader(r)
            rows = list(reader)
    
        target_substrings = rows[0][1:]
        users = rows[1:]
    
        num_matches = [dna_seq.count(target) for target in target_substrings]
        for user in users:
            user_matches = [int(x) for x in user[1:]]
            if user_matches == num_matches:
                return user[0]
    
        return "Not found"
    

    编码愉快!

    【讨论】:

    • 我不明白这个逻辑是如何工作的:[dna_seq.count(target) for target in target_substrings]。我知道这是 pythonic 但它是如何工作的。
    • @manav-dubey 此语法称为List Comprehension。本质上它是一种混合迭代和计算的方式,稍微提醒数学set-builder notation。英文翻译为:For every STR check in the dna sequence how many times it appears and save these results into a list
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多