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:

  1. 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

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu