Python siparişli bir sözlük olan OrderedDict nasıl kullanılır?

Python sözlükleri (dict türündeki nesneler) öğelerin sırasını korumaz; CPython bunu 3.6’dan beri yapmaktadır, ancak uygulamaya bağımlıdır ve diğer uygulamalarda belirsizdir; dil belirtimi 3.7’den beri sırayı korumuştur.

OrderedDict, standart kütüphanenin collections modülünde sırayı koruyan bir sözlük olarak sağlanır. Bunu kullanmak güvenlidir.

Koleksiyon modülünü içe aktarın. Standart kitaplıkta bulunur ve kurulmasına gerek yoktur.

import collections

Aşağıdakileri yazarsanız, koleksiyonları atlayabilirsiniz. aşağıdaki örneklerde.

from collections import OrderedDict

Aşağıda, OrderedDict’in nasıl kullanılacağına ilişkin bir açıklama yer almaktadır.

  • OrderedDict nesnesi oluşturma
  • OrderedDict, dict’in bir alt sınıfıdır
  • Öğeleri başa veya sona taşıma
  • Herhangi bir pozisyonda yeni bir eleman ekleyin.
  • Öğeleri yeniden düzenle (yeniden sırala)
  • Öğeleri anahtara veya değere göre sıralayın

OrderedDict nesnesi oluşturma

Yapıcı collections.OrderedDict(), OrderedDict nesnesi oluşturmak için kullanılabilir.

Boş bir OrderedDict nesnesi oluşturun ve değerler ekleyin.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Yapıcıya argümanlar belirtmek de mümkündür.

Anahtar sözcük bağımsız değişkenlerini, anahtar/değer çiftleri dizilerini (tupler (anahtar, değer) gibi) vb. kullanabilirsiniz. İkincisi, bir anahtar/değer çifti olduğu sürece bir liste veya demet olabilir.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

3.5 sürümüne kadar, anahtar kelime argümanlarının sırası korunmuyordu, ancak 3.6 sürümünden bu yana artık korunuyor.

Sürüm 3.6’da değiştirildi: PEP 468’in kabul edilmesiyle, OrderedDict yapıcısının sırası ve update() yöntemine iletilen anahtar kelime bağımsız değişkenleri korunur.
collections — Container datatypes — Python 3.10.0 Documentation

Normal sözlükler (dict tipi nesneler) de yapıcıya iletilebilir, ancak dict tipinin düzeni korumadığı uygulamalarda, ondan oluşturulan OrderedDict de düzeni korumayacaktır.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict, dict’in bir alt sınıfıdır

OrderedDict, dict’in bir alt sınıfıdır.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict ayrıca dict ile aynı yöntemlere sahiptir ve öğeleri alma, değiştirme, ekleme ve çıkarma yöntemleri dict ile aynıdır.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Ayrıntılar için aşağıdaki makaleye bakın.

Öğeleri başa veya sona taşıma

Bir öğeyi başına veya sonuna taşımak için OrderedDict’in kendi move_to_end() yöntemini kullanabilirsiniz.

Anahtarı ilk bağımsız değişken olarak belirtin. Varsayılan, sona gitmektir, ancak sondaki ikinci argüman yanlışsa, başa taşınacaktır.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Herhangi bir pozisyonda yeni bir eleman ekleyin.

İsteğe bağlı bir konumda eklenen yeni bir öğeyle yeni bir OrderedDict nesnesi oluşturmak mümkündür. Spesifik olarak, bu aşağıdaki akışta yapılabilir.

  1. list() kullanarak item() yöntemiyle elde edilebilecek görüntüleme nesnelerini listeleyin.
  2. Listenin insert() yöntemine anahtar/değer çiftlerinden oluşan bir demet (anahtar, değer) ekleyin
  3. Oluşturucu koleksiyonlarına ileterek yeni bir nesne oluşturun.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert(), ilk argüman olarak eklenecek konumu ve ikinci argüman olarak eklenecek öğeyi belirtir.

Örnekte, orijinal değişkene yeni bir nesne atanır ve orijinal nesnenin kendisine yeni bir öğe eklenmez.

Öğeleri yeniden düzenle (yeniden sırala)

Elemanların değiştirilmesi, yukarıdaki örnekteki ile aynı işlemdir.

  1. list() kullanarak item() yöntemiyle elde edilebilecek görüntüleme nesnelerini listeleyin.
  2. Listedeki öğeleri değiştirin
  3. Oluşturucu koleksiyonlarına ileterek yeni bir nesne oluşturun.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

Bir anahtar belirtmek ve değiştirmek istiyorsanız, aşağıda gösterildiği gibi anahtar listesinden dizini (konumunu) almak için index() yöntemini kullanın.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

Öğeleri anahtara veya değere göre sıralayın

items() yöntemiyle elde edilebilen görünüm nesnesine dayalı olarak sıralanmış anahtar/değer çiftlerinin bir listesini (anahtar, değer) oluşturun ve yeni bir nesne oluşturmak için onu kurucu collections.OrderedDict() öğesine iletin.

Sıralama, yerleşik sort() işlevinin bağımsız değişken anahtarı olarak bir tanımlama grubundan (anahtar, değer) bir anahtar veya değer döndüren anonim bir işlev (lambda ifadesi) belirtilerek gerçekleştirilir.

Sıralamayı tersine çevirmek istiyorsanız, sort() işlevinin ters argümanını true olarak ayarlayın.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])