การเปรียบเทียบ tuple ทำงานอย่างไรใน Python


178

ฉันได้อ่านหนังสือการเขียนโปรแกรมCore Pythonและผู้เขียนแสดงตัวอย่างเช่น:

(4, 5) < (3, 5) # Equals false

ดังนั้นฉันสงสัยว่ามันเป็นเท็จอย่างไร / ทำไมเท่ากัน? ไพ ธ อนเปรียบเทียบทูเปิลทั้งสองนี้อย่างไร

Btw มันไม่ได้อธิบายไว้ในหนังสือ

คำตอบ:


190

สิ่งอันดับจะถูกเปรียบเทียบตามตำแหน่ง: รายการแรกของสิ่งอันดับแรกถูกเปรียบเทียบกับรายการแรกของสิ่งอันดับที่สอง; หากไม่เท่ากัน (เช่นอันแรกมากกว่าหรือเล็กกว่าสอง) นั่นคือผลลัพธ์ของการเปรียบเทียบมิฉะนั้นจะถือว่ารายการที่สองเป็นรายการที่สามและอื่น ๆ

ดูการดำเนินการลำดับทั่วไป :

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

ด้วยการเปรียบเทียบมูลค่าสำหรับรายละเอียดเพิ่มเติม:

การเปรียบเทียบคำศัพท์ระหว่างคอลเลกชันในตัวทำงานดังนี้:

  • สำหรับคอลเลกชันสองรายการที่จะเปรียบเทียบเท่ากันพวกเขาจะต้องเป็นประเภทเดียวกันมีความยาวเท่ากันและแต่ละคู่ขององค์ประกอบที่เกี่ยวข้องจะต้องเปรียบเทียบเท่ากัน (ตัวอย่างเช่น[1,2] == (1,2)เป็นเท็จเพราะประเภทนั้นไม่เหมือนกัน)
  • คอลเลกชันที่สนับสนุนการเปรียบเทียบคำสั่งซื้อจะได้รับคำสั่งเหมือนกับองค์ประกอบที่ไม่เท่ากันเป็นครั้งแรก (ตัวอย่างเช่น[1,2,x] <= [1,2,y]มีค่าเหมือนกันx <= y) หากไม่มีองค์ประกอบที่สอดคล้องกันจะมีการเรียงลำดับคอลเลกชันที่สั้นลงก่อน (เช่น[1,2] < [1,2,3]เป็นจริง)

หากไม่เท่ากันลำดับจะเรียงตามลำดับเหมือนกับองค์ประกอบที่แตกต่างกันแรก ตัวอย่างเช่น cmp ([1,2, x], [1,2, y]) จะส่งกลับเช่นเดียวกับ cmp (x, y) หากองค์ประกอบที่เกี่ยวข้องไม่มีอยู่ลำดับที่สั้นกว่าจะถือว่าเล็กกว่า (ตัวอย่างเช่น [1,2] <[1,2,3] จะส่งกลับค่า True)

หมายเหตุ 1 : <และ>ไม่ได้หมายความว่า "เล็กกว่า" และ "มากกว่า" แต่ "อยู่ก่อน" และ "หลัง": ดังนั้น (0, 1) "อยู่ก่อน" (1, 0)

หมายเหตุ 2 : tuples จะต้องไม่ถูกพิจารณาว่าเป็นพาหะในพื้นที่ n- มิติเปรียบเทียบกับความยาวของมัน

หมายเหตุ 3 : หมายถึงคำถาม/programming/36911617/python-2-tuple-comparison : อย่าคิดว่า tuple นั้น "ยิ่งใหญ่" กว่าอีกสิ่งหนึ่งหากองค์ประกอบใด ๆ ขององค์ประกอบแรกมากกว่าที่สอดคล้องกัน หนึ่งในสอง


4
นี้อาจจะทำให้เข้าใจผิดเมื่อพูดถึงและ< >ยกตัวอย่างเช่นการประเมิน(0, 1) < (1, 0) True
ไม่มี

4
@CMCDragonkai - ใช่ ลอง: x = tuple([0 for _ in range(n)])และทำเช่นเดียวกันกับ y การตั้งค่า n = 100, 1,000, 10,000 และ 100,000 และการวิ่ง%timeit x==yให้ค่าเวลาเป็น. 5, 4.6, 43.9 และ 443 microseconds ตามลำดับซึ่งใกล้เคียงกับ O (n) เท่าที่คุณจะได้รับจริง
Michael Scott Cuthbert

8
@ J.Money ทำไมคุณคิดว่ามันอาจทำให้เข้าใจผิด?
อย่า

1
@CharlieParker <และ>ไม่ได้หมายความว่า "เล็กลงแล้ว" และ "ยิ่งกว่านั้น" แต่ "มาก่อน" และ "กลับมา": ดังนั้น(0, 1)"มาก่อน"(1, 0)
Don

3
@ ดอนฉันคิดว่ามันไม่ชัดเจนสำหรับเราว่าการสั่งซื้อแบบใด ฉันเดาว่าไพ ธ อนถือว่าเป็นตัวเลขโดยการตรวจสอบตัวเลขที่สำคัญที่สุดก่อนและการเดินต่อไปเพื่อทำลายความตาย ... (ในรูปแบบที่ฉลาด)
Charlie Parker

20

เอกสารหลามจะอธิบายได้

สิ่งอันดับและรายการจะถูกเปรียบเทียบโดยใช้การเปรียบเทียบขององค์ประกอบที่เกี่ยวข้อง ซึ่งหมายความว่าในการเปรียบเทียบเท่ากันแต่ละองค์ประกอบจะต้องเปรียบเทียบเท่ากันและสองลำดับจะต้องเป็นประเภทเดียวกันและมีความยาวเท่ากัน


หน้านี้เชื่อมโยงจากคำตอบนี้ดูเหมือนจะไม่มีข้อความที่ยกมา
plugwash

0

หลาม 2.5 เอกสารอธิบายมันได้ดี

สิ่งอันดับและรายการจะถูกเปรียบเทียบโดยใช้การเปรียบเทียบขององค์ประกอบที่เกี่ยวข้อง ซึ่งหมายความว่าในการเปรียบเทียบเท่ากันแต่ละองค์ประกอบจะต้องเปรียบเทียบเท่ากันและสองลำดับจะต้องเป็นประเภทเดียวกันและมีความยาวเท่ากัน

หากไม่เท่ากันลำดับจะเรียงตามลำดับเหมือนกับองค์ประกอบที่แตกต่างกันแรก ตัวอย่างเช่น cmp ([1,2, x], [1,2, y]) จะส่งกลับเช่นเดียวกับ cmp (x, y) หากไม่มีองค์ประกอบที่เกี่ยวข้องลำดับที่สั้นกว่านั้นจะถูกเรียงลำดับก่อน (เช่น [1,2] <[1,2,3])

น่าเสียดายที่หน้านั้นดูเหมือนว่าจะหายไปในเอกสารประกอบสำหรับรุ่นล่าสุด


0
ฉันมีความสับสนมาก่อนเกี่ยวกับการเปรียบเทียบจำนวนเต็มดังนั้นฉันจะอธิบายให้เป็นตัวอย่างสำหรับผู้เริ่มต้นที่เป็นมิตรมากขึ้น

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A ถูกแปลงเป็น ASCII ที่สอดคล้องord('A') #65กันเหมือนกันสำหรับองค์ประกอบอื่น ๆ

ดังนั้น >> a>b # True คุณสามารถคิดว่ามันเป็นการเปรียบเทียบระหว่างสตริง (มันเป็นจริง)

สิ่งเดียวกันสำหรับจำนวนเต็มเกินไป

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

เพราะ (1 ไม่มากกว่า 1 ย้ายไปที่ถัดไป 2 ไม่มากกว่า 2 ย้ายไปที่ 2 ถัดไปน้อยกว่าสาม -lexicographically -)

จุดสำคัญถูกกล่าวถึงในคำตอบข้างต้น

คิดว่ามันเป็นองค์ประกอบอยู่ก่อนที่ตัวอักษรอื่นองค์ประกอบไม่มากกว่าองค์ประกอบและในกรณีนี้พิจารณาองค์ประกอบ tuple ทั้งหมดเป็นหนึ่งสตริง


2
(1,2,3) > (1,2,2)ให้True
Vishal Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.