ฉันมีรหัสที่มีลักษณะดังนี้:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
โอเคมันง่ายมาก แต่คุณเข้าใจแล้ว ตอนนี้thing
อาจจะไม่เป็นจริงในรายการซึ่งในกรณีนี้ผมต้องการที่จะผ่าน thing_index
-1 ในภาษาอื่นนี่คือสิ่งที่คุณคาดหวังว่าindex()
จะได้รับคืนหากไม่พบองค์ประกอบ ในความเป็นจริงมันพ่นไฟล์ValueError
.
ฉันสามารถทำได้:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
แต่มันรู้สึกสกปรกและฉันไม่รู้ว่าValueError
จะเลี้ยงดูด้วยเหตุผลอื่นได้ไหม ฉันคิดวิธีแก้ปัญหาต่อไปนี้ตามฟังก์ชั่นเครื่องกำเนิดไฟฟ้า แต่ดูเหมือนจะซับซ้อนเล็กน้อย:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
มีวิธีที่สะอาดกว่าในการบรรลุสิ่งเดียวกันหรือไม่? สมมติว่ารายการไม่ได้เรียงลำดับ
str.find
วิธีการที่ทำเช่นนั้นคือส่งกลับ-1
เมื่อไม่พบเข็มในเรื่อง
str.index()
จะทำให้เกิดข้อยกเว้นหากไม่พบสตริงการค้นหา
thing_index
" - นี่ไม่ใช่ Pythonic แน่นอน การส่งผ่านค่าโทเค็น (ที่ไม่มีความหมาย) ในกรณีที่การดำเนินการไม่ประสบความสำเร็จจะถูกขมวดคิ้วข้อยกเว้นเป็นวิธีที่ถูกต้องที่นี่ โดยเฉพาะอย่างยิ่งเนื่องจากthing_list[-1]
เป็นนิพจน์ที่ถูกต้องซึ่งหมายถึงรายการสุดท้ายในรายการ