Mengapa berhenti mengulangi setelah nilai pertama?

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

Di best_match saya diberikan daftar yang berisi urutan DNA (dna_list). Dengan menggunakan fungsi di atas saya perlu membandingkan setiap urutan dengan dna (dna) yang diberikan. Kemudian kembalikan urutan DNA dengan kemiripan tertinggi. Saya mencoba membuat kamus untuk menyimpan urutan DNA dengan nilai kesamaannya dan kemudian membandingkan kesamaan dan kemudian mengembalikan urutan yang sesuai. Namun, saya terjebak. Ketika saya menjalankan ini, ia hanya mengembalikan satu urutan DNA dan nilai kesamaan itu; namun, saya diberikan tiga urutan DNA. Saya juga mengalami kesulitan karena daftar urutan DNA yang diberikan (di dna_list) bisa berbeda-beda.


person Community    schedule 20.07.2015    source sumber
comment
Saya tidak terlalu yakin dengan maksud Anda, maaf   -  person    schedule 21.07.2015
comment
Karena Python menggunakan spasi untuk menunjukkan blok, dan spasi yang salah menyebabkan IndentationError, Anda harus sangat berhati-hati saat menempelkan kode yang diindentasi dengan benar di sini. Jika lekukan Anda salah, kami tidak tahu apakah ini sebenarnya masalah kode Anda atau kesalahan salin/tempel.   -  person Two-Bit Alchemist    schedule 21.07.2015
comment
Semua lekukan sudah benar   -  person    schedule 21.07.2015


Jawaban (1)


Anda membuat kamus baru di setiap iterasi. Itu tidak berhenti melakukan iterasi, ia hanya mengembalikan nilai dari iterasi terakhir, mengabaikan yang sebelumnya.

Yang Anda inginkan adalah ini:

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

return result

yang dapat ditulis lebih singkat dengan pemahaman kamus:

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

Selain itu, Anda tidak boleh memanggil variabel dict karena akan membayangi tipe bawaan dict.

person BartoszKP    schedule 20.07.2015
comment
Mengapa inisialisasi sebagai dict() daripada {}? - person Two-Bit Alchemist; 21.07.2015
comment
Terima kasih itu berhasil! (seperti yang disebutkan, saya mengubahnya menjadi tanda kurung kurawal) Tapi bisakah Anda menjelaskan kepada saya result[dna_seq] = kesamaan(dna1, dna2) ? Seperti cara kerjanya. - person ; 21.07.2015
comment
@ Two-BitAlchemist Menurut saya itu masalah selera :) dict menurut saya lebih eksplisit, jadi lebih baik untuk pemula. Secara umum saya tidak keberatan {}. - person BartoszKP; 21.07.2015
comment
@BartoszKP Jelas merupakan pilihan gaya yang saya hormati. Hanya ingin tahu apakah ada fungsi di balik formulir yang saya lewatkan. - person Two-Bit Alchemist; 21.07.2015
comment
@ water847 Lihat di sini misalnya: tutorialspoint.com/python/python_dictionary.htm dan baca dokumentasi dict :) - person BartoszKP; 21.07.2015
comment
Ah, aku mengerti! Terima kasih banyak :) sebelum saya mencoba dan menyadari itu tidak mungkin - apakah mungkin untuk membandingkan nilai kesamaan lalu mengembalikan kunci dengan nilai tertinggi? - person ; 21.07.2015
comment
@ water847 Tidak dengan dict secara langsung, tetapi secara umum semuanya mungkin :) Jika Anda memiliki pertanyaan lain, silakan posting sebagai pertanyaan SO baru. Ingatlah untuk mematuhi aturan (pusat bantuan) dan memberikan deskripsi yang jelas tentang masalah Anda, dan setelah Anda yakin tidak ada jawabannya sudah ada di tutorial/dokumentasi :) Cheers! - person BartoszKP; 21.07.2015