ชุดตัวดำเนินการ "in" ของ Python


143

ฉันสับสนเล็กน้อยเกี่ยวกับตัวinดำเนินการของหลามสำหรับเซต

หากฉันมีชุดsและอินสแตนซ์บางอย่างbมันเป็นความจริงหรือไม่ที่b in sหมายความว่า " มีองค์ประกอบบางอย่างxในsที่b == xเป็นtrue " หรือไม่?


77
คุณเป็นนักคณิตศาสตร์หรือไม่? อธิบายสิ่งที่เรียบง่ายในวิธีที่ซับซ้อนมากเกินไป .. ;)
ThiefMaster

13
นักวิทยาศาสตร์คอมพิวเตอร์ ฉันสับสนเล็กน้อยเพราะเอกสารบอกว่า "ทดสอบ x สำหรับสมาชิกใน s" สำหรับฉันที่อาจหมายถึง "อินสแตนซ์ x มีอยู่ใน s" หรือ "อินสแตนซ์บางตัวมีอยู่ใน s ที่มีค่าเหมือนกับ x" ฉันไม่รู้ว่านี่เป็นการเปรียบเทียบตัวตนหรือความเท่าเทียมกันหรือไม่
Dejas

6
@Dejas: เนื่องจากคุณทราบว่า Python มีผู้ให้บริการสองรายการเปรียบเทียบความเท่าเทียมกันและการเปรียบเทียบข้อมูลประจำตัวคุณควรจะสามารถสร้างการทดสอบที่ยืนยันแต่ละรายการได้ มันจะช่วยถ้าคุณโพสต์การทดสอบนั้น
S.Lott

คำตอบ:


101

ใช่ แต่มันก็หมายความว่าhash(b) == hash(x)ดังนั้นความเท่าเทียมกันของรายการไม่เพียงพอที่จะทำให้พวกเขาเหมือนกัน


14
ตกลงดังนั้น "มีองค์ประกอบ x ใน s ที่ hash (b) == hash (x) และ x == b" หรือไม่
Dejas

12
หากมีคนใช้ฟังก์ชันแฮชของคลาสของเขาในลักษณะที่บิดเบี้ยวนี่คือสิ่งที่เขาอาจได้รับ (และสมควร)
ugoren

84

ถูกตัอง. คุณสามารถลองในล่ามเช่นนี้

>>> a_set = set(['a', 'b', 'c'])

>>> 'a' in a_set
True

>>>'d' in a_set
False

2
นี่ไม่ใช่การทดสอบที่ดีมากเนื่องจากค่าคงที่ของสตริงมักจะอยู่ภายใน (ลองa = 'a'; b = 'a'; a is b) ฉันลองใช้มันa = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])แทน
Philipp

11

ใช่มันอาจหมายถึงอย่างนั้นหรืออาจเป็นตัววนซ้ำแบบง่าย ตัวอย่างเช่น: เป็นตัววนซ้ำ:

a=set(['1','2','3'])
for x in a:
 print ('This set contains the value ' + x)

ในทำนองเดียวกันเป็นการตรวจสอบ:

a=set('ILovePython')
if 'I' in a:
 print ('There is an "I" in here')

แก้ไข: แก้ไขเพื่อรวมชุดแทนที่จะเป็นรายการและสตริง


2
สิ่งนี้เกี่ยวข้องกับฉากหรือไม่
Ignacio Vazquez-Abrams

ดีฉันคิดว่ารายการหรือแม้กระทั่งสตริงถือได้ว่ามีคุณสมบัติคล้ายกับชุด พวกเขาคือชุดขององค์ประกอบ
Arnab Ghosal

1
ไม่ชุดมีเงื่อนไขเพิ่มเติมสำหรับการตรวจสอบการบรรจุที่ไม่มีลำดับ
Ignacio Vazquez-Abrams

3

สตริงแม้ว่าจะไม่ใช่setชนิด แต่มีinคุณสมบัติที่มีค่าในระหว่างการตรวจสอบความถูกต้องในสคริปต์:

yn = input("Are you sure you want to do this? ")
if yn in "yes":
    #accepts 'y' OR 'e' OR 's' OR 'ye' OR 'es' OR 'yes'
    return True
return False

ฉันหวังว่าสิ่งนี้จะช่วยให้คุณเข้าใจการใช้inตัวอย่างนี้ได้ดียิ่งขึ้น


2
นั่นไม่ใช่ชุด หรือสตริงที่ไม่แน่นอน
Ignacio Vazquez-Abrams

7
... or 'e' or 'es' or 's'. พิจารณาเพียงลบคำตอบที่ผิดอย่างไร้จุดหมายนี้
Quuxplusone

3

ชุดทำงานแตกต่างจาก dicts คุณต้องใช้ชุดการทำงานเช่น issubset ():

>>> k
{'ip': '123.123.123.123', 'pw': 'test1234', 'port': 1234, 'debug': True}
>>> set('ip,port,pw'.split(',')).issubset(set(k.keys()))
True
>>> set('ip,port,pw'.split(',')) in set(k.keys())
False

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