Skip to content

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.

In [1]: ord('A'), ord('B')
Out[1]: (65, 66)

In [2]: 'A' < 'B'
Out[2]: True
- 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.

In [3]: 'A' < 'ABC' < 'ABD' < 'C' < 'Pascal' < 'Python'
Out[3]: True
- ord fonksiyonu yardımıyla ASCII değerlerini de görmek için

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.

# 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