Listeleri Karşılaştırma

Merhaba. Python’da örnekler yaparken aklıma bir şey takıldı. Bir sürü deneme yaptım gerek for i in olsun gerek .count() olsun gerek de .split() olsun ama bir türlü çözemedim. Mesela programda tanımlı olarak “Hypnogaja - Here Comes the Rain Again” karakter dizesi var. Kullanıcı da sadece comes the rain veya comes rain again yazarak bunu ekrana yazmak istiyor. Program ne yazılacak şeyi ne de bunların kaçıncı sırada olduğunu biliyor. Sadece yazılacak şey ile tanımlı olan değişkenin içindekileri kelime kelime alıp ilk olarak ilk kelimenin kaç kere geçtiğini, ikinci olarak ikinci kelimenin gibi bir karşılaştırmaya tabi tutuyor. Sonuç olarak da girilen değerle tanımlı değişken arasında 3 veya daha fazla kelime eşleşiyorsa bunu ekrana yazıyor. Yardımcı olabilecek biri var mı bu konuda?

Düzenleme: Python Belgelerinin şu kısmında sanırım istediğim şey var. Biraz daha uğraşsam iyi olacak bu doğrultuda.
https://belgeler.yazbel.com/python-istihza/karakter_dizilerinin_metotlari2.html#count

Merhaba, kelimelerin sırası önemli değilse, bir karakter dizisinin en az 3 kelimesi kullanıcı tarafından girilmişse, karakter dizisi ekrana bastırılır.

x = "Hypnogaja - Here Comes the Rain Again"

say = 0
for i in input(">>> ").split():
    if i in x.split():
        say += 1
    if say >= 3:
        print(x)
1 Beğeni

Çok teşekkür ediyorum. Bir türlü yapamamıştım. Bunu os modülünü kullanarak listelediğimiz bir şarkı klasöründeki şarkılar için yapabilir miyiz? Mesela

for j in listdir("Music"):
    print(j)

Çıktısı:
Pink Floyd - Comfortably Numb.mp3
Pink Floyd - Wish You Were Here.mp3
Hypnogaja - Here Comes the Rain Again.mp3

For döngüsüyle şarkı klasörünü listeyerek yaptım ama sadece son listelenen şarkıyı alıyor böyle.

import os

for j in os.listdir("Music"):
    print(j)

say = 0
for i in input(">>> ").split():
    if i in j.split():
        say += 1
    if say >= 3:
        print(j)

Düzeltmem gereken kısım nedir acaba?

Döngüzü olarak yazınca da .split() kullanıldığı için hata veriyor. :frowning:

Traceback (most recent call last):
 File "C:\Users\semih\Desktop\b.py", line 8, in <module>
 if i in j.split():
 AttributeError: 'list' object has no attribute 'split'

Aşağıdaki kodlara göre, kullanıcının girdiği 3 tane kelime eğer dosyanın isminde geçiyorsa, o dosya ismi ekrana bastırılır. Kullanıcı 3 tane kelimeyi tek bir satırda girmek zorunda değil. İlk satıra “Pink Floyd” yazabilir, ikinci satıra “Wish” yazabilir, bu üç kelime şayet dosyalardan birinin isminin içinde geçiyorsa, o dosyanın ismi ekrana bastırılır. Kullanıcı ilk satıra “Wish You Were”, “Wish Were Here”, “Pink Wish You” vb. yazılar yazabilir, Bunların arasından üç kelime şayet bir dosya isminde geçiyorsa, o dosya ekrana bastırılır. Kullanıcı dosyanın isminde geçmeyen bir kelime yazabilir, 3 tane kelime dosyanın isminin içinde geçene kadar işlem tekrar edilir. Yani kullanıcı istediği satırda bu dosyaların isimlerinde olan üç tane kelimeyi girmek zorunda.

import os

dosyalar = [i.replace(".mp3", "") for i in os.listdir(os.getcwd()) if i.endswith(".mp3")]
ayikla = set()

while len(ayikla) != 3:
    for i in input(">>> ").split():
        for j in dosyalar:
            if i in j.split():
                ayikla.add(i)
    if len(ayikla) >= 3:
        break

for i in dosyalar:
    if ayikla.issubset(set(i.split())):
        print(i)


1 Beğeni

Ne kadar teşekkür etsem az. Python belgelerini tekrar gözden geçirsem iyi olacak. Bir türlü beceremiyorum çünkü ben.

Yo, yapabilirsiniz, kendinize zaman tanıyın. Elbette belgeleri tekrar gözden geçirin ama yapamayacağınızı düşünmeyin.

1 Beğeni

@fiRE, kod görünümü elde etmek için bir önceki paragraf ile kod arasında bir satır boşluk bırakmanız gerek. Sizin kodunuzu düzenledim, bu gönderiyi düzenle tuşuna basarak nasıl yaptığımı inceleyebilirsiniz.

Bir de Python girintileme üzerine kurulu bir dildir. Bir for döngüsü içine alacağınız bir kodu bu döngüye göre 4 satır girintileyerek yazmalısınız. Yani For döngüsüyle şarkı klasörünü listeyerek yaptım ama sadece son listelenen şarkıyı alıyor böyle. dediğiniz kod aslında şöyle olmalı:

import os

for j in os.listdir("Music"):
    print(j)

    say = 0
    for i in input(">>> ").split():
        if i in j.split():
            say += 1
        if say >= 3:
            print(j)

İyi çalışmalar.

1 Beğeni

Dünden beri uğraşıyorum ama bir türlü sonuca ulaşamadım. .lower() komutu listeler ile kullanılamaz gibi hatalar alıyorum. Listelenen şarkıların tümünü küçük harf yapma şansımız var mı? Çünkü kullanıcı küçük büyük harfe dikkat etmediği zaman bir sonuç elde edilmiyor.

Lütfen aşağıdaki kodları bir inceleyin.

import os

# Madem program küçük harfe duyarlı olacak, o halde şarkı isimlerindeki
# karakterleri küçültmek gerekiyor.
dosyalar = [i.lower().replace(".mp3", "") for i in os.listdir(os.getcwd()) if i.endswith(".mp3")]
ayikla = set()

while len(ayikla) != 3:
    for i in input(">>> ").split():
        for j in dosyalar:
            # Kullanıcı büyük harf de girse, bu harfler küçültülüp,
            # şarkı isimlerinde geçip geçmedikleri denetlenecek.
            if i.lower() in j.split():
                # Kullanıcının girdiği harfleri küçülterek kümeye eklemek lazım.
                ayikla.add(i.lower())
    if len(ayikla) >= 3:
        break

for i in dosyalar:
    if ayikla.issubset(set(i.split())):
        print(i)
1 Beğeni

Tekrar tekrar teşekkürler. Düz mantık düşünmeyi bir kenara bırakmam gerekiyor.

Kullanıcıya sunacağınız çıktıdaki kelimelerin ilk harflerini sonradan büyütebilirsiniz.

import os

dosyalar = [i.lower().replace(".mp3", "") for i in os.listdir(os.getcwd()) if i.endswith(".mp3")]
ayikla = set()

while len(ayikla) != 3:
    for i in input(">>> ").split():
        for j in dosyalar:
            if i.lower() in j.split():
                ayikla.add(i.lower())
    if len(ayikla) >= 3:
        break

ayiklanmis = [i for i in dosyalar if ayikla.issubset(set(i.split()))]

satir = [] 
for i in ayiklanmis:
    sutun = []
    for j in i.split():
        sutun.append(j.capitalize())
    satir.append(sutun)

for i in satir:
    print(*i)
1 Beğeni