Python ile bir listeyi belirtilen sayıda eleman kadar sağa kaydırın
Python kullanarak örnek algoritma sorularını çözdüğümüz serimizin ikinci sorusuna geçelim:
- Bir listeyi belirtilen sayıda eleman kadar sağa kaydırın.
- Örnek: [1, 2, 3, 4, 5], k = 2
- Sonuç: [4, 5, 1, 2, 3]
Diziyi belirli bir adet kaydırmak için rotate isimli bir fonksiyon oluşturdum. Python’da listelerle çalışırken dilimleme (slicing) yöntemini kullanarak bu işlemi kolaylıkla gerçekleştirebiliriz. Bakınız:
1 2 3 4 5 6 7 8 |
def rotate(nums, k): k %= len(nums) nums[:] = nums[-k:] + nums[:-k] nums = [1, 2, 3, 4, 5] k = 2 rotate(nums, k) print(nums) # [4, 5, 1, 2, 3] |
Kodu çalıştırmak için: Trinket
Kodumuzun açıklamasını maddeler halinde özetledik:
- Fonksiyon içerisinde,
k
değerini dizi uzunluğuna göre mod alarak (yani kalanını alarak) dizi uzunluğundan fazla bir kaydırma yapmamak için kendi değerini güncelledim.
k %= len(nums):
satırında, k değerini nums
listesinin uzunluğuna mod alarak (yani kalanını alarak) güncelliyoruz. Bu, eğer k
değeri nums
‘in uzunluğundan büyükse veya ona eşitse, gereksiz dönüşleri ortadan kaldırmamızı sağlar. Örneğin, eğer bir liste 5 elemanlıysa ve bu listeyi 5 ya da 10 kez kaydırmak isterseniz, aslında hiç kaydırmamanız gerekiyor, çünkü bu durumda liste orijinal haliyle kalır. Yani listeyi 7 kere kaydırmak istersek, aslında sadece 2 kere kaydırmamız gerektiği anlamı çıkmaktadır.
- Ardından
nums[:] = nums[-k:] + nums[:-k]
: ile dilimleme (slicing) yöntemi ile kaydırma işlemi gerçekleştirdim.nums[-k:]
: Dizinin sonk
elemanını alır. Örneğin, eğerk
2 ise ve listemiz[1, 2, 3, 4, 5]
ise bu kısım bize[4, 5]
verir (0, 1, 2 indeksindeki elemanlar atılır).nums[:-k]
: Dizinin başından sonk
elemanına kadar olan kısmını alır. Aynı listede bu kısım bize[1, 2, 3]
listesini (-1, -2 indeksine sahip elemanlar atılır) verir.- Şimdi bu iki dilimlenmiş listeyi birleştirerek (
+
operatörü ile) sorunun bizden istediği kaydırılmış listeyi elde ederiz. Yani,[4, 5] + [1, 2, 3]
bize[4, 5, 1, 2, 3]
sonucunu verir. nums[:] = ...
: Bu yapı ile orijinalnums
listesinin tamamını (başından sonuna kadar olan kısmını) yeni kaydırılmış listeyle güncelliyoruz.