Python ile Listede Üç Tane Olan Sayıları Ayrı Bir Listede Döndürme
Python kullanarak örnek algoritma sorularını çözdüğümüz serimizin altıncı sorusuna geçelim:
- Bir dizideki, aynı sayıdan üç tane bulunanları ayrı bir liste içinde döndüren program yazın
- Örnek girdi: [1, 2, 2, 2, 4, 4, 4, 2, 5, 3, 6, 7, 3, 3]
- Örnek çıktı: [3, 4]
def find_triples(numbers, target_count=3):
# Sayıların kaç kez geçtiğini takip eden bir sözlük oluşturalım
number_counts = {}
# Her sayı için, eğer sözlükte bu sayı varsa, sayının değerini bir artır
# Eğer sözlükte bu sayı yoksa, bu sayıyı sözlüğe ekleyip değerini 1 yap
for num in numbers:
if num in number_counts:
number_counts[num] += 1
else:
number_counts[num] = 1
# Sadece hedef sayı kadar geçen sayıları bir listeye ekleyelim
triples = []
for num, count in number_counts.items():
if count == target_count:
triples.append(num)
return triples
# Örnek girdiyle fonksiyonu test edelim
sample_input = [1, 2, 2, 2, 4, 4, 4, 2, 5, 3, 6, 7, 3, 3]
print(find_triples(sample_input))
Yukarıdaki örnekte, bir dizi içerisinde tam olarak belirli bir sayıda (bu örnekte 3) geçen sayıları tespit etmek amacıyla fonksiyon oluşturduk. İlk adımda, number_counts
adında bir sözlük tanımladık. Bu sözlük, anahtar olarak sayıları ve değer olarak bu sayıların kaç kez geçtiğini saklamak için kullanılmıştır. Ayrıca koşul ifadeleri için if-else ifadelerini kullandık.
Sonrasında, numbers
dizisini bir for döngüsü ile geziyoruz. Bu döngü içerisinde her bir sayıyı (yani num
‘u) alıp number_counts
sözlüğünde kontrol ediyoruz. Eğer bu sayı (num
) zaten sözlükte varsa, bu sayının tekrarı olduğu anlamına gelir ve bu sayının değerini (yani kaç kez karşımıza çıktığını gösteren değeri) bir artırıyoruz. Eğer sözlükte bu sayı yoksa, bu sayıyı anahtar olarak ekleyip değerini 1 yapıyoruz.
Bu işlem sonucunda, number_counts
sözlüğü, dizideki her sayının kaç kez geçtiğini gösteren bir yapıya sahip oluyor.
Daha sonra, bu sözlüğü bir for
döngüsü ile tekrar geziyoruz. Bu döngüde sözlüğün anahtar-değer çiftlerini num
ve count
değişkenlerine atıyoruz. Eğer bir sayının değeri (yani count
değişkeni) tam olarak 3 ise, bu sayıyı triples
adlı listeye ekliyoruz.
Fonksiyonun son adımında, bu triples
listesini döndürüyoruz. Bu liste, girdi dizisinde tam olarak 3 kez geçen sayıları içeriyor. Kodu çalıştırmak için: Trinket
❗ Ayrıca belirtmek isterim ki; iki farklı for
döngüsü içinde kullanılan num
değişkenleri birbirinden bağımsızdır. Her bir for
döngüsü kendi kapsamında (scope) çalışır ve bu kapsam içinde tanımlanan değişkenler, döngü dışında aynı isimde başka bir değişkenin değerini etkilemez. Bu nedenle, ilk for
döngüsünde num
‘un alabileceği değerler ve ikinci for
döngüsünde num
‘un alabileceği değerler birbirinden bağımsızdır. İlk döngüde num
, numbers
listesindeki elemanları alırken, ikinci döngüde num
, number_counts
sözlüğündeki anahtarları alır.
Yukarıdaki çözümü pekala list comprehension yöntemini kullanarak kısaltabiliriz. Bakınız:
def find_triples_comprehension(numbers, target_count=3):
# Sayıların kaç kez geçtiğini takip eden bir sözlük oluşturalım
number_counts = {}
for num in numbers:
number_counts[num] = number_counts.get(num, 0) + 1
# List comprehension ile sadece hedef sayı kadar geçen sayıları bir listeye ekleyelim
triples = [num for num, count in number_counts.items() if count == target_count]
return triples
# Örnek girdiyle fonksiyonu test edelim
sample_input = [1, 2, 2, 2, 4, 4, 4, 2, 5, 3, 6, 7, 3, 3]
find_triples_comprehension(sample_input)
print(find_triples_comprehension(sample_input))
Kodu çalıştırmak için: Trinket