หนึ่งในโครงสร้างข้อมูลพื้นฐานใน Python คือพจนานุกรมซึ่งอนุญาตให้บันทึก "คีย์" เพื่อค้นหา "ค่า" ทุกประเภท สิ่งนี้ถูกนำไปใช้ภายในเป็นตารางแฮชหรือไม่ ถ้าไม่มันคืออะไร
หนึ่งในโครงสร้างข้อมูลพื้นฐานใน Python คือพจนานุกรมซึ่งอนุญาตให้บันทึก "คีย์" เพื่อค้นหา "ค่า" ทุกประเภท สิ่งนี้ถูกนำไปใช้ภายในเป็นตารางแฮชหรือไม่ ถ้าไม่มันคืออะไร
คำตอบ:
ใช่มันคือการแมปแฮชหรือตารางแฮช คุณสามารถอ่านรายละเอียดของการดำเนินการ Dict หลามเป็นหนังสือที่เขียนโดยทิมปีเตอร์สที่นี่
นั่นเป็นเหตุผลที่คุณไม่สามารถใช้บางสิ่งบางอย่างที่ 'ไม่แฮช' เป็นคีย์ dict เช่นรายการ:
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับตารางแฮชหรือตรวจสอบวิธีการนำไปใช้ในไพ ธ อนและทำไมมันจึงถูกนำไปใช้ในวิธีนั้น
.keys()
สามารถดึงรายการคีย์ได้ ตารางแฮชจริงจะไม่เก็บคีย์เพียงแฮชเพื่อประหยัดพื้นที่
จะต้องมีพจนานุกรม Python มากกว่าการค้นหาตารางบนแฮช () จากการทดลองที่ดุร้ายฉันพบการชนกันของแฮชนี้:
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
แต่มันก็ไม่ได้ทำลายพจนานุกรม:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
ตรวจสอบสติ:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
อาจมีระดับการค้นหาอื่นนอกเหนือจากแฮช () ที่หลีกเลี่ยงการชนระหว่างคีย์พจนานุกรม หรืออาจ dict () ใช้แฮชอื่น
(โดยวิธีการนี้ใน Python 2.7.10 เรื่องเดียวกันใน Python 3.4.3 และ 3.5.0 ที่มีการปะทะกันที่hash(1.1) == hash(214748749.8)
)
hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
นี่ให้ทศนิยม 19 หลัก - -4037225020714749784
ถ้าคุณ geeky พอที่จะสนใจ ดำเนินการต่อในคำพูดของคุณเองเด็ก ๆ และแฮชยังคงเป็นตัวเลข 19 หลัก ฉันคิดว่ามีข้อ จำกัด เกี่ยวกับความยาวของสายอักขระที่คุณสามารถแฮชใน Python ได้ แต่ปลอดภัยที่จะพูดถึงสตริงที่เป็นไปได้มากกว่าค่าที่เป็นไปได้ และhash(False)
= 0 โดยวิธีการ
ใช่. ภายในจะมีการใช้งานเป็น hashing แบบเปิดที่ยึดตามพหุนามดั้งเดิมมากกว่า Z / 2 ( แหล่งที่มา )
หากต้องการขยายคำอธิบายของ nosklo:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
การดำเนินงาน