เหตุใดจึงหยุดวนซ้ำหลังจากค่าแรก

def similarity(dna1, dna2):
    count = 0
    for i in range(len(dna1)):
        if dna1.lower()[i] == dna2.lower()[i]:
            count += 1
    return count / len(dna1)

def best_match(dna_list, dna):
    for dna_seq in dna_list:
        dna1 = dna_seq
        dna2 = dna
        dict = {dna_seq: similarity(dna1, dna2)}
    return dict

ใน best_match ฉันได้รับรายการที่มีลำดับดีเอ็นเอ (dna_list) การใช้ฟังก์ชันข้างต้นฉันต้องเปรียบเทียบแต่ละลำดับกับดีเอ็นเอที่กำหนด (dna) จากนั้นส่งคืนลำดับดีเอ็นเอที่มีความคล้ายคลึงกันสูงสุด ฉันกำลังพยายามสร้างพจนานุกรมเพื่อจัดเก็บลำดับดีเอ็นเอด้วยค่าความคล้ายคลึงกัน จากนั้นเปรียบเทียบความคล้ายคลึงกัน แล้วส่งคืนลำดับที่สอดคล้องกัน อย่างไรก็ตาม ฉันติดอยู่ เมื่อฉันเรียกใช้สิ่งนี้ มันจะส่งคืนลำดับดีเอ็นเอเพียงลำดับเดียวและค่าความคล้ายคลึงนั้น อย่างไรก็ตาม ฉันได้รับลำดับดีเอ็นเอสามลำดับ ฉันยังประสบปัญหาเนื่องจากรายการลำดับดีเอ็นเอที่กำหนด (ใน dna_list) อาจแตกต่างกันไป


person Community    schedule 20.07.2015    source แหล่งที่มา
comment
ฉันไม่แน่ใจเหมือนกันว่าคุณหมายถึงอะไร ขออภัย   -  person    schedule 21.07.2015
comment
เนื่องจาก Python ใช้ช่องว่างเพื่อแสดงบล็อก และช่องว่างที่ผิดพลาดทำให้เกิด IndentationError คุณจึงต้องระมัดระวังอย่างยิ่งในการวางโค้ดที่เยื้องอย่างถูกต้องที่นี่ หากการเยื้องของคุณไม่ถูกต้อง เราไม่รู้ว่านี่เป็นปัญหาจริงในโค้ดของคุณหรือเป็นข้อผิดพลาดในการคัดลอก/วาง   -  person Two-Bit Alchemist    schedule 21.07.2015
comment
การเยื้องทั้งหมดถูกต้อง   -  person    schedule 21.07.2015


คำตอบ (1)


คุณกำลังสร้างพจนานุกรมใหม่ทุกครั้งที่ทำซ้ำ มันไม่ได้หยุดวนซ้ำ แต่เพียงส่งคืนค่าจากการวนซ้ำครั้งล่าสุด โดยไม่สนใจค่าก่อนหน้า

สิ่งที่คุณต้องการคือ:

result = dict()
for dna_seq in dna_list:
    dna1 = dna_seq
    dna2 = dna
    result[dna_seq] = similarity(dna1, dna2)

return result

ซึ่งสามารถเขียนให้สั้นลงได้ด้วยความเข้าใจในพจนานุกรม:

return {dna_seq:similarity(dna_seq, dna) for dna_seq in dna_list}

นอกจากนั้น คุณไม่ควรเรียกตัวแปร dict เพราะมันจะบดบังประเภทบิวท์อิน dict

person BartoszKP    schedule 20.07.2015
comment
เหตุใดจึงกำหนดค่าเริ่มต้นเป็น dict() แทนที่จะเป็น {} - person Two-Bit Alchemist; 21.07.2015
comment
ขอบคุณที่ได้ผล! (อย่างที่กล่าวไว้ฉันเปลี่ยนเป็นวงเล็บปีกกา) แต่คุณช่วยอธิบายให้ฉันหน่อยได้ไหม result[dna_seq] =ความคล้ายคลึงกัน(dna1, dna2) ? เช่นเดียวกับวิธีการทำงาน - person ; 21.07.2015
comment
@ Two-BitAlchemist ฉันคิดว่านั่นเป็นเรื่องของรสนิยม :) dict ดูเหมือนชัดเจนสำหรับฉันมากกว่าดังนั้นจึงดีกว่าสำหรับผู้เริ่มต้น โดยทั่วไปฉันไม่รังเกียจ {} - person BartoszKP; 21.07.2015
comment
@BartoszKP เป็นตัวเลือกสไตล์ที่ฉันเคารพอย่างแน่นอน แค่อยากรู้ว่ามีฟังก์ชั่นบางอย่างอยู่เบื้องหลังแบบฟอร์มที่ฉันขาดหายไปหรือไม่ - person Two-Bit Alchemist; 21.07.2015
comment
@ water847 ดูตัวอย่างที่นี่: tutorialspoint.com/python/python_dictionary.htm และอ่าน เอกสารของ dict :) - person BartoszKP; 21.07.2015
comment
อ่าฉันเข้าใจแล้ว! ขอบคุณมาก :) ก่อนที่ฉันจะลองและรู้ว่ามันเป็นไปไม่ได้ - เป็นไปได้ไหมที่จะเปรียบเทียบค่าความคล้ายคลึงแล้วส่งคืนคีย์ด้วยค่าสูงสุด - person ; 21.07.2015
comment
@ water847 ไม่ใช่ dict โดยตรง แต่โดยทั่วไปแล้วทุกอย่างเป็นไปได้ :) หากคุณมีคำถามอื่นโปรดโพสต์เป็นคำถาม SO ใหม่ อย่าลืมปฏิบัติตามกฎ (ศูนย์ช่วยเหลือ) และให้คำอธิบายที่ชัดเจนเกี่ยวกับปัญหาของคุณ และหลังจากที่คุณแน่ใจว่าไม่มี ตอบแล้วในการกวดวิชา / เอกสารประกอบ :) ไชโย! - person BartoszKP; 21.07.2015