Python 3.7'de Sözlüklerin Anahtar Giriş Sırasını Hatırlaması

python

#1

Anlaşılan o ki Python 3.7 ile birlikte sözlükler, anahtarların ekleniş sırasını hatırlayacak. Bu özellik normalde sözlüklerde yoktu ancak OrderedDict'te vardı. Böylece Python 3.7’den itibaren sözlüklerden anahtarları, eklediğimiz sırayla alabileceğiz. İlgili değişiklik maddesi:

  • the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec.

Kaynak: https://docs.python.org/3.7/whatsnew/3.7.html#summary-release-highlights


#2

Hocam çok güzel bir haber verdiğiniz için teşekkürler, aşağıdaki örneği bir gün lazım olur diye kendime hatıtlatıcı olarak yazıyorum :slight_smile:

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
a == b == c == d == e
True

#3

Aslında bu örneğin bu konu ile bir ilgisi yok. Python 3.7 öncesinde de bu şekilde çalışırdı. Bu gelişme, sözlüklerin eşitliği değil de bir sözlükteki anahtar sırasının korunması ile ilgili.


#4

Hocam size zahmet olacak ama konuyu siz örneklendirirseniz daha iyi anlayabileceğim sanki :slight_smile:


#5

Hocam güzel bir örnek buldum, 3.6 da bunu collections modülle hallediyoruz, 3.7 bunu artık otomatikleştirmiş anladım şimdik, direk otomatik olarak sözlüğü sayı, harf cinsine göre sıralıyor.
örnek link;
https://pymotw.com/2/collections/ordereddict.html


#6

Aslında sıralamıyor. Sadece anahtar-değer çiftlerinin eklendiği sırayı hatırlıyor. Aslında en baştan böyle yapılabilirdi. Örneğin listeler gibi eklenme sırasının hatırlanması imkansız bir şey değil. Ancak sözlüğün kendi içinde, hız için, anahtarları tutma algoritması gereği sıranın hatırlanması bir yük olduğu için böyle yapılmadı. Veri yapılarından hash’i incelerseniz neden bunun gerekli olduğunu anlayabilirsiniz. Şimdi bundan taviz mi verildi yoksa taviz vermeden yeni bir veri yapısı mı kullanıldı bilmiyorum. Ancak işimize yarayacağı kesin.

Bir örnek vereyim. Aşağıdaki örnek Python 2’den (ki bu sürümde yukarıda bahsettiğim yenilik yok):

>>> py2 = {'1': 'bir', '2': 'iki', '3': 'uc'}
>>> py2
{'1': 'bir', '3': 'uc', '2': 'iki'}

Biz anahtarları '1', '2', '3' sırasında girdik ancak gördüğünüz gibi '1', '3', '2' sırasında kaydedildi.

Şimdi de Python 3.7’de aynı örneği yapalım:

>>> py37 = {'1': 'bir', '2': 'iki', '3': 'üç'}
>>> py37
{'1': 'bir', '2': 'iki', '3': 'üç'}

Görüyorsunuz, anlatmaya gerek yok… :smile:


#7

bu sefer kesin anladım hocam :smile: Eğer py2 = {‘1’: ‘bir’, ‘2’: ‘iki’, ‘3’: ‘uc’} burada ‘3’:‘uc’ ikinci sırada yazsaydık py37 de çıktı {‘1’: ‘bir’, ‘3’: ‘uc’, ‘2’: ‘iki’} olcaktı çünkü eklediğimiz sırayı hatırlıyor, sıralama yapmıyor.


#9

Bu güncellemenin 3.7 ile geldiğine emin misiniz? Ben 3.2 sürümünde de 3.7 ile aynı şekilde karşılaştım.


#10

Bir örnek verir misiniz?
Şurada Python 3.7 ile gelen yenilikler arasında yer almış: https://docs.python.org/3.7/whatsnew/3.7.html#summary-release-highlights


#11

String verilerini hatırlıyor. Ancak sayılarda sıralıyor.
Screenshot_2018-11-03-17-47-24-1


#12

Her durumda hatırlaması gerek eğer böyle bir özellik varsa. Ayrıca hatırlıyor dediğiniz durum aslında hatırladığı anlamına gelmez. Algoritmadan dolayı böyle sıralamış olabilir. Farklı örneklerle deneyin.


#13

Ben şu an yeterince tatmin oldum. 3.2 üzerinde neredeyse hiç kullanmadığım sözlükleri daha fazla karıştırmaya gerek yok.