kesalahan penulisan ketika tidak ada yang kembali dari Tuple dalam daftar

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input(str("colour? "))
for c in tup_list:
    if x in c:
        print(c[0])
    else:
        print("error ")

Contoh kode^

Jika pengguna memasukkan "merah", outputnya adalah:

111
error
error
444

Jika pengguna memasukkan "biru", outputnya adalah:

error
222
error
error

Dll. Jika pengguna memasukkan "randomchars" (karakter acak apa pun) yang tidak ada di tup_list, outputnya adalah:

error
error
error
error

Saya memahami bahwa kode saya mencetak "kesalahan" untuk setiap c di tup_list. Saya ingin kode saya menulis "kesalahan" satu kali jika input pengguna tidak ada dalam tup_list. Saya juga tidak mengerti mengapa kesalahan dicetak untuk setiap kecocokan negatif dalam tup_list (misalnya memasukkan warna merah menghasilkan 111 dan 444 dengan benar, tetapi juga memberikan dua kesalahan untuk tupel biru dan kuning).


person acgf    schedule 06.07.2018    source sumber
comment
itu yang diharapkan: jika cocok, ia mencetak yang lain ia mencetak kesalahan... sudahkah Anda mempertimbangkan untuk menggunakan kamus dengan nama warna sebagai kunci dan angka sebagai nilai (sebagai daftar sehingga lebih dari 1 dapat dikaitkan dengan 1 warna)? itu akan menghindari perulangan.   -  person Jean-François Fabre    schedule 06.07.2018


Jawaban (3)


Kode mencetak 'error' untuk setiap c di tup_list tidak cocok karena Anda mengulangi setiap c di tup_list. Di setiap iterasi, Anda memeriksa apakah warnanya cocok, dan di setiap iterasi Anda mencetak apakah cocok (nomor kode) atau tidak ('error'). Anda dapat memiliki variabel boolean untuk memverifikasi apakah cocok atau tidak:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input('colour? ')

match = False
for c in tup_list:
    if x in c:
        print(c[0])
        match = True

if not match:
    print('error')
person yyyyyyyan    schedule 06.07.2018
comment
Terima kasih! Semua solusi lainnya juga berhasil, tetapi solusi ini adalah yang paling sederhana. - person acgf; 07.07.2018

Di sini kita mengumpulkan daftar item yang cocok terlebih dahulu, lalu mencetaknya atau melakukan kesalahan.

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input("colour? ")
matches = [c for c in tup_list if x in c]
if matches:
    print('\n'.join(m[0] for m in matches))
else:
    print("error")

(Saya juga mengganti str("colour? ") dengan "colour? ": sudah berupa string, tidak perlu mentransmisikannya)

person Eugene Primako    schedule 06.07.2018
comment
Kode dapat diperbaiki jika daftar matches hanya terdiri dari kode angka, jadi [c[1] for c in tup_list if x in c]. Dengan begitu, Anda tidak memerlukan perulangan if matches - print('\n'.join(matches)) - person yyyyyyyan; 07.07.2018
comment
@YanOrestes Anda benar. Tapi saya menulis ulang kode saya dengan cara yang sedikit berbeda untuk menunjukkan pendekatan yang sedikit berbeda. - person Eugene Primako; 07.07.2018

Karena Anda memiliki pernyataan if/else di perulangan for, pernyataan tersebut akan menemukan kecocokan warna, atau mencetak kesalahan. Jika Anda ingin mencetak semua kecocokan dan hanya mencetak error sekali, Anda memerlukan struktur percabangan yang sedikit berbeda.

Saya akan merekomendasikan:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]

matches = []

x = input(str("colour? "))
for c in tup_list:
    if x in c:
        matches.append(c[0])

if matches:
    print("\n".join(map(str, matches)))
else:
     print("error")

Perhatikan bahwa saya harus memetakan setiap kecocokan dari int ke str karena join() mengharapkan daftar string.

person Daniel Smith    schedule 06.07.2018