Python Lexicographic Ordering (Sözlüksel Sıralama)¶
Sequence(dizge, sıralı, dizi) objeleri aynı türdeki diğer objeler ile karşılaştırma işlemine tabi tutulabilir. Bu karşılaştırma işleminde lexicographic yani sözlüksel sıralama kullanılmaktadır.
Lexicographic yani sözlüksel sıralama adından da anlaşılacağı üzere verilerin sözlükteki alfabetik sıralamalarına bakarak sıralama yapmaktır. Örneğin A harfi B'den önce gelmektedir ve dolayısıyla A < B karşılaştırması True sonucunu vermektedir.
Tekil karakterler için sözlüksel sıralama ASCII sıralamasını göz önüne almaktadır. ord() fonksiyonu ile bir karakterin ASCII değerini elde edebiliriz.
- Aşağıdaki örnekte farklı uzunluktaki string tipindeki verilerin sözlüksel olarak karşılaştırmaları yapılmıştır. Karşılaştırmada 1. karaktere bakıldıktan sonra varsa 2, 3 ...N karakterlere de bakılmaktadır. - ord fonksiyonu yardımıyla ASCII değerlerini de görmek içinIn [4]: [ord(i) for i in 'ABC']
Out[4]: [65, 66, 67]
In [5]: [ord(i) for i in 'ABD']
Out[5]: [65, 66, 68]
# 3. karakter ASCII değeri kontrol edildiğinde C(67) değeri D(68) değerinden küçük olduğu görülmektedir.
# tuple
In [1]: (1, 2, 3, 399) < (1, 2, 4)
Out[1]: True
# list
In [2]: [1, 2, 3, 399] < [1, 2, 4]
Out[2]: True
In [3]: [1, 2, 3, 399, 4] < [1, 2, 4]
Out[3]: True
# Aşağıdaki örnekte 1. tuple 2. tuple'ın alt kümesi gibidir.
# 1. ve 2. eleman karşılaştırmasından sonra 2. tuple'da 1 eleman fazla(-5 olan) olduğu için sonuç True
In [4]: (1, 2) < (1, 2, -5)
Out[4]: True
In [5]: (1, 2, 3) < (1.0, 2.0, 3.0)
Out[5]: False
# Aynı uzunlukta ve tüm değerleri eşit olduğu için iki tuple eşitliği True dönmektedir.
In [6]: (1, 2, 3) == (1.0, 2.0, 3.0)
Out[6]: True
In [7]: (1, 2, ('aa', 'ab')) < (1, 2, ('aa', 'ac'))
Out[7]: True
# tuple içindeki tuple'ın son elemanları kıyaslandığında 'ab' > 'a' olduğu için sonuç False döner
In [8]: (1, 2, ('aa', 'ab')) < (1, 2, ('aa', 'a'))
Out[8]: False
Django queryset örnek¶
In [1]: Entity.objects.all()
Out[1]: <QuerySet [<Entity: abc>, <Entity: abc2>]>
In [2]: u1 = Entity.objects.get(size='abc')
In [3]: u2 = Entity.objects.get(size='abc2')
# In[6]'da görüleceği üzere b -> ASCII değeri 98 ve size 'abc' < 'b' oldğu için response boş döner
In [4]: Entity.objects.filter(size__gt='b')
Out[4]: <QuerySet []>
# size 'abc' > 'a' olduğu için response aşağıdaki gibi dolu döner
In [5]: Entity.objects.filter(size__gt='a')
Out[5]: <QuerySet [<Entity: abc>, <Entity: abc2>]>
In [6]: ord('a'), ord('b')
Out[6]: (97, 98)
# queryset input tiplerinin kontrol edilMEmesi istenmeyen sonuçların dönmesine neden olabilir.
In [7]: Entity.objects.filter(size__gt='96')
Out[7]: <QuerySet [<Entity: abc>, <Entity: abc2>]>
# Normalde kullanıcı tarafından 96 integer olarak gönderilmeliydi ve 'abc' ile 96 kıyaslanMAmalıydı.
In [8]: 'abc' > '96'
Out[8]: True
In [9]: ord('9')
Out[9]: 57
In [10]: ord('6')
Out[10]: 54
In [11]: l1 = [ord(i) for i in 'abc']
In [12]: l2 = [ord(i) for i in '96']
In [13]: l1
Out[13]: [97, 98, 99]
In [14]: l2
Out[14]: [57, 54]
In [15]: l1 > l2
Out[15]: True