มีฟังก์ชั่นสั้น ๆ สำหรับรายการหรือไม่?


514

ฉันเห็นคนกำลังใช้anyรวบรวมรายการอื่นเพื่อดูว่ามีรายการอยู่ในรายการหรือไม่ แต่มีวิธีที่รวดเร็วในการทำหรือไม่:

if list.contains(myItem):
    # do something

คำถามของคุณบอกเป็นนัยว่าคุณสนใจเฉพาะในรายการที่มีรายการไม่ใช่รายการที่มีรายการย่อย? / tuple / set / frozenset / ... ?
smci

คำตอบ:


873

คุณสามารถใช้ไวยากรณ์นี้:

if myItem in list:
    # do something

นอกจากนี้ตัวดำเนินการผกผัน:

if myItem not in list:
    # do something

มันทำงานได้ดีสำหรับรายการสิ่งอันดับชุดและ dicts (ตรวจสอบคีย์)

โปรดทราบว่านี่เป็นการดำเนินการ O (n) ในรายการและสิ่งอันดับ แต่การดำเนินการ O (1) ในชุดและ dicts


1
ด้วยรายการที่มีอาร์เรย์ numpy จะตรวจสอบอินสแตนซ์ numpy หรือค่าภายในอินสแตนซ์ numpy นี้หรือไม่
Daniel Möller

ระวังนะ! การแข่งขันนัดนี้อาจเป็นสิ่งที่คุณไม่คาดคิด:o='--skip'; o in ("--skip-ias"); # returns True !
อเล็กซ์ F

3
@AlexF: นั่นตรงกันเพราะ("--skip-ias")ไม่ใช่ tuple แต่สตริง (วงเล็บไม่ทำอะไรเลยเหมือนกับ(1)เป็นจำนวนเต็ม) หากคุณต้องการ 1 tuple คุณต้องเพิ่มเครื่องหมายจุลภาคหลังรายการเดียว: ("--skip-ias",)(หรือ(1,))
Blckknght

โปรดทราบว่าหากคุณกำลังเปรียบเทียบอักขระนี่เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
Tillson

65

นอกจากสิ่งที่คนอื่นพูดคุณอาจสนใจที่จะรู้ว่าสิ่งที่inเรียกว่าlist.__contains__วิธีการที่คุณสามารถกำหนดในชั้นเรียนใด ๆ ที่คุณเขียนและสามารถใช้งานไพ ธ อนได้อย่างเต็มที่  

การใช้ใบ้อาจจะ:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

ฉันมากับซับนี้หนึ่งเมื่อเร็ว ๆ นี้เพื่อรับTrueถ้ารายการมีจำนวนรายการที่เกิดขึ้นใด ๆ หรือFalseถ้ามันไม่มีสิ่งใดเกิดขึ้นหรืออะไรเลย การใช้next(...)จะให้ค่าส่งคืนเริ่มต้น ( False) และหมายความว่าควรรันเร็วกว่าการรันรายการความเข้าใจทั้งหมด

list_does_contain = next((True for item in list_to_test if item == test_item), False)


ในกรณีของฉันฉันมีรายการของวัตถุที่เรียกว่าประเภทและจำเป็นต้องใช้เพื่อทดสอบเฉพาะการเชื่อมโยงคุณสมบัติดังนั้นการแก้ปัญหานี้เหมาะกับกรณีของฉัน ขอบคุณ
rodrigorf

3
any(item == test_item for item in list_to_test)ฉันจะทำงานด้วยเหมือนกัน
มีคนบางคนที่

3

เมธอด list indexจะส่งคืน-1หากไอเท็มไม่มีอยู่และจะส่งคืนดัชนีของไอเท็มในรายการหากมีอยู่ อีกทางเลือกหนึ่งในifคำสั่งที่คุณสามารถทำต่อไปนี้:

if myItem in list:
    #do things

นอกจากนี้คุณยังสามารถตรวจสอบว่าองค์ประกอบไม่ได้อยู่ในรายการที่มีคำสั่งต่อไปนี้:

if myItem not in list:
    #do things

15
indexวิธีไม่กลับ -1 ถ้าองค์ประกอบไม่อยู่ก็โยนValueErrorข้อยกเว้น
MondKin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.