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.x
In [1]: ord('A'), ord('B')Out[1]: (65, 66)In [2]: 'A' < 'B'Out[2]: TrueAş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.
xxxxxxxxxxIn [3]: 'A' < 'ABC' < 'ABD' < 'C' < 'Pascal' < 'Python'Out[3]: Trueordfonksiyonu yardımıyla ASCII değerlerini de görmek içinx
In [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.Aşağıda sözlüksel sıralamaya string haricinde karşılaştırma örnekleri verilmiştir.
# tupleIn [1]: (1, 2, 3, 399) < (1, 2, 4)Out[1]: True# listIn [2]: [1, 2, 3, 399] < [1, 2, 4]Out[2]: TrueIn [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ç TrueIn [4]: (1, 2) < (1, 2, -5)Out[4]: TrueIn [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]: TrueIn [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önerIn [8]: (1, 2, ('aa', 'ab')) < (1, 2, ('aa', 'a'))Out[8]: False
Django queryset örnek
xxxxxxxxxxIn [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önerIn [4]: Entity.objects.filter(size__gt='b')Out[4]: <QuerySet []># size 'abc' > 'a' olduğu için response aşağıdaki gibi dolu dönerIn [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]: l1Out[13]: [97, 98, 99]
In [14]: l2Out[14]: [57, 54]
In [15]: l1 > l2Out[15]: True
Yorumlar