Dizilerden eşleşen öğeleri bulmak


#1

Merhaba. Python öğrenmeye çalışıyorum. Aşağıdaki dizilerim var:
a=“bende 1 kilo elma var”
b=“sanırım sende 1 kilo ayva var”
c=“onda da 2 kilo elma var”

Bu diziler içinde bulunan kelimeleri karşılaştırıp, “kilo, 3 adet”, “var, 3 adet”, “1, 2 adet” sonucunu (eşleşenler) elde etmek istiyorum. split(), re.search(), re.findall() vb. arasında boğuldum. Yardım lütfen!


#2

Karakter dizilerinin count fonksiyonunu kullanmayı deneyin.


#3

Cevap için teşekkürler. Fakat sanırım sorunumu iyi anlatamadım. Önce FARKLI üç dizideki eşleşenleri bulmam gerekiyor, sonra onları count() ile sayabilirim. Kümelerin intersection() metodu ile kesişimi bulabiliyorum.

küme1=set([“bende”, “1”, “kilo”, “elma”, “var”])
küme2=set([“sanırım”, “sende”, “2”, “kilo”, “ayva”, “var”])
küme3=set([“onda”, “da”, “2”, “kilo”, “elma”, “var”])
küme1&küme2&küme3
{‘kilo’, ‘var’}

Buradaki “kilo” ve “var” kelimelerini saydırmak için kümeleri yeniden diziye çevirebilirim artık. Ama eşleştirmede bir sorunum var. 3 adet olan kelimeler her üç kümede de geçiyor, dolayısı ile kesişen kümede bulunuyor. Fakat iki defa geçen “2” karakterini elde edemiyorum Halbuki benim amacım “kilo, 3 adet”, “var, 3 adet”, “2, 2 adet” sonucunu elde etmek. Yani intersection() tam olarak işimi görmüyor. Ayrıca diziden kümeye veya listeye çevirme, sonra yeniden diziye çevirme bana kulağımı tersten göstermek gibi geliyor, daha pratik bir yolu olmalı diye düşünüyorum acemice. Tekrar teşekkürler.


#4

Hiç set işine girmeden, şu şekilde yapabilirsiniz.

# -*- coding: cp1254 -*-
a="bende 1 kilo elma var"
b="sende 2 kilo ayva var"
c="onda 2 kilo elma var"

ifade = " ".join([a,b,c]) # birleştirme yapıyoruz
result = {}

for i in ifade.split():
    if(result.get(i,None) == None): # eğer daha önceden eklenmemiş ise
        if(ifade.count(i)>=2): # iki ve üzeri olanları ekliyoruz
            result[i] = ifade.count(i)      
    

for i in result:
    print("{} adet {} kelimesi var".format(result[i],i))

#5

Çok teşekkür ederim, mükemmel çalışıyor. Yalnız kodları anlamaya çalışıyorum ve birkaç gün daha anlamaya çalışacağım anlaşılıyor. Var olun gençler!


#6

Kodları şu şekilde açıklayabilirim. ifade değişkeni, yukarıdaki 3 karakter dizisini aralarında " " olmak üzere birleştirdiğimiz bir karakter dizisi. Şu şekilde de birleştirebilirdik

ifade = a + " " + b + " " + c
-------------------------------
ifade = "bende 1 kilo elma var sende 2 kilo ayva var onda 2 kilo elma var

Böyle yapmamızın sebebi, count() metodu yardımıyla karakter dizisi içerisinde sayma işlemini tek seferde yaptırmak. 3 karakter dizisini ayrı ayrı incelemek yerine birleştirip öyle işlem yapıyoruz.

for döngüsünde, ifade değişkenimizi boşluktan parçalayıp liste haline getiriyoruz, ki her elemanının üzerinden geçip saydırmak için

>>> ifade.split()
['bende', '1', 'kilo', 'elma', 'var', 'sende', '2', 'kilo', 'ayva', 'var', 'onda', '2', 'kilo', 'elma', 'var']

Şu kısım, eğer bir kelimenin üzerinden geçip te sözlüğe eklemediysek ekleyelim diye kontrol etmek içindir.

if(result.get(i,None) == None):

Bir sözlüğün içerisinde i’yi arayıp, varsa kendisini değilse None döndürme işlemini yaptık. Eğer yoksa None değerini döndürecektir. Madem sözlüğümüzde yok, biz de karakter dizimiz üzerinde count() ile i’yi saydırıp, 2’den fazla ise sözlüğümüze koyalım dedik. Mesela o anda ‘i’ değeri, “elma” olsun

result["elma"] = ifade.count("elma")

Böylece sözlüğümüze “elma” ifadesini, 2 değeriyle beraber kaydettik(2 adet elma kelimesi olduğu için)

Umarım anlaşılır olarak anlatmışımdır. Anlamadığınız yeri tekrar tekrar sorun lütfen. İyi forumlar.

Ek olarak, sözlük yapıları hakkında bilginiz yoksa biraz araştırıp bakarak kodu anlayabilirsiniz sanırım.


#7

Bir teşekkür yazmıştım ama burada göremiyorum. Elinize ve emeğinize sağlık, çok yardımcı oldunuz. tekrar teşekkürler.


#8

Rica ederim iyi çalışmalar.