การเขียนผิดพลาดเมื่อไม่มีอะไรส่งคืนจากทูเพิลภายในรายการ

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

ตัวอย่างโค้ด^

หากผู้ใช้ป้อน "สีแดง" ผลลัพธ์จะเป็น:

111
error
error
444

หากผู้ใช้ป้อน "สีน้ำเงิน" ผลลัพธ์จะเป็น:

error
222
error
error

ฯลฯ หากผู้ใช้ป้อน "randomchars" (อักขระสุ่มใดๆ) ที่ไม่อยู่ใน tup_list ผลลัพธ์จะเป็น:

error
error
error
error

ฉันเข้าใจว่ารหัสของฉันกำลังพิมพ์ "ข้อผิดพลาด" สำหรับแต่ละ c ใน tup_list ฉันต้องการให้รหัสของฉันเขียน "ข้อผิดพลาด" ครั้งเดียวหากอินพุตของผู้ใช้ไม่อยู่ใน tup_list ฉันยังไม่เข้าใจด้วยว่าเหตุใดจึงพิมพ์ข้อผิดพลาดสำหรับการจับคู่เชิงลบแต่ละรายการภายใน tup_list (เช่น การป้อนสีแดงจะได้ 111 และ 444 อย่างถูกต้อง แต่ยังให้ข้อผิดพลาดสองครั้งสำหรับสิ่งอันดับสีน้ำเงินและสีเหลืองด้วย)


person acgf    schedule 06.07.2018    source แหล่งที่มา
comment
เป็นไปตามที่คาดไว้: หากตรงกัน จะพิมพ์ออกมาอย่างอื่นจะพิมพ์ข้อผิดพลาด... คุณเคยพิจารณาใช้พจนานุกรมที่มีชื่อสีเป็นคีย์และตัวเลขเป็นค่าหรือไม่ (ตามรายการที่สามารถเชื่อมโยงกับ 1 สีได้มากกว่า 1 สี) มันจะหลีกเลี่ยงการวนซ้ำ   -  person Jean-François Fabre    schedule 06.07.2018


คำตอบ (3)


รหัสกำลังพิมพ์ 'error' สำหรับแต่ละ c ใน tup_list ซึ่งไม่ตรงกันเนื่องจากคุณวนซ้ำแต่ละ c ใน tup_list ในการวนซ้ำแต่ละครั้ง คุณกำลังตรวจสอบว่าสีตรงกันหรือไม่ และในการวนซ้ำแต่ละครั้ง คุณจะพิมพ์ว่าสีตรงกัน (หมายเลขรหัส) หรือไม่ ('error') คุณสามารถมีตัวแปรบูลีนเพื่อตรวจสอบว่าตรงกันหรือไม่:

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
ขอบคุณ! โซลูชันอื่น ๆ ทั้งหมดก็ใช้ได้ผลเช่นกัน แต่วิธีนี้เป็นวิธีที่ง่ายที่สุด - person acgf; 07.07.2018

ที่นี่เรารวบรวมรายการที่ตรงกันก่อน จากนั้นจึงพิมพ์หรือเกิดข้อผิดพลาด

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

(ฉันยังแทนที่ str("colour? ") ด้วย "colour? " ด้วย: มันเป็นสตริงอยู่แล้ว ไม่จำเป็นต้องร่ายมัน)

person Eugene Primako    schedule 06.07.2018
comment
รหัสสามารถปรับปรุงได้หากรายการ matches ประกอบด้วยรหัสตัวเลขเท่านั้น ดังนั้น [c[1] for c in tup_list if x in c] ด้วยวิธีนี้คุณไม่จำเป็นต้องวนซ้ำ if matches - print('\n'.join(matches)) - person yyyyyyyan; 07.07.2018
comment
@YanOrestes คุณพูดถูก แต่ฉันเขียนโค้ดใหม่ด้วยวิธีอื่นเล็กน้อยเพื่อแสดงแนวทางที่แตกต่างออกไปเล็กน้อย - person Eugene Primako; 07.07.2018

เนื่องจากคุณมีคำสั่ง if/else ใน for loop คำสั่งดังกล่าวจะค้นหาสีที่ตรงกันหรือพิมพ์ข้อผิดพลาดออกมา หากคุณต้องการพิมพ์รายการที่ตรงกันทั้งหมดและพิมพ์ error เพียงครั้งเดียว คุณต้องมีโครงสร้างการแยกย่อยที่แตกต่างกันเล็กน้อย

ฉันอยากจะแนะนำ:

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

โปรดทราบว่าฉันต้องแมปการจับคู่แต่ละรายการจาก int ถึง str เนื่องจาก join() คาดว่าจะมีรายการสตริง

person Daniel Smith    schedule 06.07.2018