Listede aynı elemanları bulma

Liste elemanlarını karşılaştırmak ve aynı olan elemanları sözlük olarak almak istiyorum. temel problem, listenin çok uzun olması. Ayrıca kümeler yöntemi ile yaptığımda, sonuç sıralı gelmediği için işime yaramıyor. Örnek liste ve kodlarım aşağıda.

liste= ["londra ingilterenin baş şehridir",
          "italya çizmeye benzer",
          "venedik italyanın bir şehridir",
          "paris fransanın baş şehridir",
          "finlandiya kuzey kutbuna yakındır"]
a=liste[0]
b=liste[1]
c=liste[2]
d=liste[3]
e=liste[4]

dizi1=a.split()
dizi2=b.split()
dizi3=c.split()
dizi4=d.split()
dizi5=e.split()

sonuç= []

if set(dizi1).intersection(set(dizi2)) != None:
    aa=set(dizi1).intersection(set(dizi2))
    sonuç.append(aa)
if set(dizi1).intersection(set(dizi3)) != None:
    bb=set(dizi1).intersection(set(dizi3))
    sonuç.append(bb)
.....
.....
if set(dizi2).intersection(set(dizi3))
.....
.....

print(sonuç)```

Beklediğim sonuç: ```sonuç = {"baş şehridir":3,  "şehridir":2}```

Liste uzun olunca (tablo sorgusundan geliyor) bir döngü kullanmak gerekiyor ama beceremedim. Belki uygun kütüphaneler vardır, bilemiyorum. Lütfen yardım edin. Teşekkürler.

Abi çok bir şey anlamadım dediklerinden fakat şöyle bi şey var bi de bunu dene belki çözer sorununu :::::

listem = ["foruma","daha","sık","girin"]

xas = input("Soru cevaplamayı da unutmayın :   ")

çıktı = []

 if xas in listem:
çıktı.append(xas)

print(çıktı)

Abi ayrıca öbür sefere nokta falan koyma aralara . Belirtmene gerek yok anlarız biz . Hem sana zarar . Sorunu çözmek isteyen arkadaş kodu kopyalayıp ohoo bu noktalarla virgüllerle mi uğraşacam geç yaw diyebilir .

ilginize ve uyarınıza teşekkür ederim. Aşağıdaki kodlar tüm alt listelerde ortak olan elemanları
veriyor. Ama benim istadiğim, sadece bazı listelerde ortak olan elemanları süzmek. Bu yüzden
“common elements” yerine “aynı olan elemanlar” terimini kullandım.

test_list = [[2, 3, 5, 8], [2, 6, 7, 3], [10, 9, 2, 3]] 

# common element extraction form N lists 
# using map() + intersection() 
res = list(set.intersection(*map(set, test_list))) 

print ("The common elements from N lists : " + str(res)) 
OUTPUT:
The original list is : [[2, 3, 5, 8], [2, 6, 7, 3], [10, 9, 2, 3]]
The common elements from N lists : [2, 3]```

# istediğim şu:

The original list is : [[2, 3, 5, 8], [2, 6, 7, 9], [10, 9, 2, 3]] # ortadaki listede 3'ü 9 yaptım
The common elements from N lists :[ [2, 3], [2,9] ]

Bu problemi çözmenin bir yolunu bulamadım. Sanırım daha iyi anlatabilmişimdir.

Teşekkürler, ama verdiğiniz linkte bir liste içindeki tekrarlı değerlerden bahsediliyor.
Aşağıdaki şekilde uzun yoldan çözdüm. Ama çok uzun listeler için daha kısa ve daha hızlı bir sistem gerekiyor sanırım. Bu kadarı 0.49368065444050496 sn.
Bu kodları daha efektif nasıl yazabiliriz?

liste= ["londra ingilterenin baş şehridir",
        "italya çizmeye benzer",
          "venedik italyanın bir şehridir",
          "paris fransanın baş şehridir",
          "finlandiya kuzey kutbuna yakındır"]

yeniliste = liste.copy()# her döngüde ilk elemanı silebilmekiçin kopyalama

kalip = [] # tekrarlanan elemanlar için
kaliplar = []# en az iki tekrarlanan eleman istiyorum

def kalip_arama(kaliplar):
    for i in liste:
        metin = i.split()
        #print("metin=",metin)
        del yeniliste[0]
        #print("yeniliste =",yeniliste)

        for t in yeniliste:
            dizi = t.split() 
            #print("dizi",dizi)
        
            for p in metin:# tekrarlanan elemanı alıyorum
                if p in dizi and p not in kalip:
                    kalip.append(p)
                    #print("kalıp=", kalip)
                
                    if len(kalip)>1: # kalıp en az iki kelime olmalı
                        if " ".join(kalip) not in kaliplar:
                            kaliplar.append(" ".join(kalip))
                            #print("kalıplar =",kaliplar)
            del kalip[:]
        
kalip_arama(kaliplar)

print(kaliplar)# ["baş şehridir"]
1 Beğeni
liste= ["londra ingilterenin baş şehridir",
          "italya çizmeye benzer",
          "venedik italyanın bir şehridir",
          "paris fransanın baş şehridir",
          "finlandiya kuzey kutbuna yakındır"]
sozluk = {}
sonuc = list()
for i in liste:
    kelimeler = i.split()
    for j in kelimeler:
        if j in sozluk:
            sozluk[j] += 1
        else:
            sozluk[j] = 1
# Kelimeleri sıralı olarak görek için sözlük verilerini listeye aktarıyoruz.
for a,b in sozluk.items():
    sonuc.append((a,b))
sonuc.sort()
print(sonuc)

Teşekkür ederim. Bir de “aynı olan elemanlar” sorununu çözebilseydik! Derdini anlatmakta benim kadar beceriksiz birine daha rastlamadım şu alemde.

Set yerine şöyle bir yöntem de kullanabilirsiniz:

x = [1, 2, 2, "a", "b"]
y = []
for i in x:
    if i not in y:
        y.append(i)
2 Beğeni

Şu şekilde bir cevap doğru mu acaba?

def find_same(a,b):
    a = a.split()
    b = b.split()
    result = []
    min_word = a if len(a) < len(b) else b
    for i in range(len(min_word)):
        if a[i] == b[i]:
            result.append(min_word[i])
    return " ".join(result) if len(result) else None

sozluk = {}

 for i in liste:
     for k in liste:
         if(i!=k):
             cevap = find_same(i,k)
             if(cevap):
                 sozluk[cevap] = sozluk.get(cevap,0)+1

print(sozluk) # çıktı {'şehridir': 4, 'baş şehridir': 2}
1 Beğeni

Vaktinize, emeğinize sağlık. teşekkürler. “şehridir” kelimesi listede 4 değil, 3 adet var. Ayrıca daha geniş bir metinde başka benzer hatalar da veriyor scriptiniz, daha eksik sayma gibi. Nedenini anlamaya çalışıyorum. Fakat bu hali ile de bana çok değerli şeyler çağrıştırdı, üzerinde çalışacağım.
Yeri mi bilmiyorum ama, geniş bir metin için kodlarımın son hali şu: Belki başkalarının da işine yarar bir gün.


import re
alphabets= "([A-Za-z])"
prefixes = "(Mr|St|Mrs|Ms|Dr)[.]"
suffixes = "(Inc|Ltd|Jr|Sr|Co)"
starters = "(Mr|Mrs|Ms|Dr|He\s|She\s|It\s|They\s|Their\s|Our\s|We\s|But\s|However\s|That\s|This\s|Wherever)"
acronyms = "([A-Z][.][A-Z][.](?:[A-Z][.])?)"
websites = "[.](com|net|org|io|gov)"

text = """Elinizdeki kitap, Python programlama dili için kapsamlı bir Türkçe
kaynak oluşturma projesi olan yazbel.com‘un bir ürünüdür. Bu kitabın amacı,
herhangi bir sebeple Python programlama diline ilgi duyan, bu programlama
dilini öğrenmek isteyen kişilere bu dili olabildiğince hızlı, ayrıntılı ve
kolay bir şekilde öğretmektir.

Bu kitabın hedef kitlesi, programlamayı hiç bilmeyen kişilerdir. Bu sebeple,
bu kitapta ders konularını olabildiğince ayrıntılı ve basitleştirilmiş bir
şekilde ele almaya çalıştık.

Bu Kitaptan Nasıl Yararlanabilirim?
Elinizdeki kitap, epey uzun ve ayrıntılı makalelerden oluşuyor. Dolayısıyla bu
kitabı elinize alıp bir roman gibi okumaya çalışırsanız, sıkılıp öğrenme
azminizi kaybedebilirsiniz. Bu kitabı sıkılmadan ve bıkkınlığa düşmeden takip
edebilmeniz için size birkaç öneride bulunalım.

Programlama dillerini, sanki tarih, coğrafya veya felsefe çalışıyormuşsunuz
gibi, kitaba gömülüp harıl harıl okuyarak öğrenemezsiniz. Programlama dillerini
öğrenebilmek için sizin de etkin bir şekilde öğrenme sürecine katılmanız
gerekir. Yani bu kitaptaki makalelere kafanızı gömmek yerine, bol bol örnek
kod yazmaya çalışırsanız, öğrendiğiniz şeyler zihninizde daha kolay yer
edecektir. Birincisi bu.

İkincisi, kimse sizden bu kitaptaki her ayrıntıyı ezberlemenizi beklemiyor.
Maharet, bir konuya ilişkin bütün ayrıntıları akılda tutabilmekte değildir.
İyi bir programcı, bir konuya dair nasıl araştırma yapacağını ve kaynaklardan
nasıl faydalanacağını bilir. Bir yazılım geliştirici adayı olarak sizin de
öğrenmeniz gereken şey, gördüğünüz bütün konuları en ince ayrıntısına kadar
ezberlemeye kalkışmaktan ziyade, o konuya ilişkin ilk aşamada fikir sahibi
olmaya çalışmaktır. Python’da ilerledikçe, zaten belli alanlara ilgi duyacak,
kendinizi o alanlarda geliştirmeye çalışacaksınız. Elbette çok uğraştığınız
konulara ilişkin ayrıntılar da daha kolay aklınızda kalacaktır. Üstelik bir
projeye ilişkin gerekliliklerin sizi yönlendirmesiyle, belli konularda daha
ayrıntılı araştırma yapma fırsatı da bulacaksınız.

Üçüncüsü, bir konuyu çalışırken yeterince anlayamadığınızı hissederseniz,
lütfen dudağınızı büzüp bir duvar köşesine kıvrılarak kendi kendinizi
yılgınlığa düşürmeyin. Eğer bir konuyu anlamadıysanız, okuyup geçin.
Okuyup geçmek içinize sinmiyorsa, aşağıda belirttiğimiz şekilde yardım isteyin.

Nereden Yardım Alabilirim?
Bu kitapta Python programlama diline ilişkin konuları olabildiğince temiz ve
anlaşılır bir dille anlatmaya çalıştık. Ancak yine de bazı konular zihninizde
tam olarak yer etmeyebilir. Üstelik kimi zaman, bir konuyu daha iyi
anlayabilmek ya da bir sorunun üstesinden gelebilmek için bilen birilerinin
yardımına da ihtiyaç duyabilirsiniz. İşte böyle durumlarda yazbel.com’un forum
alanına uğrayarak başka Python programcılarından yardım isteyebilirsiniz.

Forum alanı hem bilgi edinmek, hem de bildiklerinizi paylaşmak için oldukça
elverişli bir ortamdır. Foruma ilk girişiniz muhtemelen yardım istemek için
olacaktır. Ama ilerleyen zamanlarda Python bilginiz arttıkça bir de
bakacaksınız ki yardım ararken yardım eder duruma gelmişsiniz. İşte forum;
kendinizdeki değişimi görmek, bilgi düzeyinizdeki artışı takip etmek ve hatta
yeni şeyler öğrenmek için bulunmaz bir fırsattır.
"""
# Aşağıdaki fonksiyon alıntıdır. Kısaltmadan kullandım.
def split_into_sentences(text):
    text = " " + text + "  "
    text = text.replace("\n"," ")
    text = re.sub(prefixes,"\\1<prd>",text)
    text = re.sub(websites,"<prd>\\1",text)
    if "Ph.D" in text: text = text.replace("Ph.D.","Ph<prd>D<prd>")
    text = re.sub("\s" + alphabets + "[.] "," \\1<prd> ",text)
    text = re.sub(acronyms+" "+starters,"\\1<stop> \\2",text)
    text = re.sub(alphabets + "[.]" + alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>\\3<prd>",text)
    text = re.sub(alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>",text)
    text = re.sub(" "+suffixes+"[.] "+starters," \\1<stop> \\2",text)
    text = re.sub(" "+suffixes+"[.]"," \\1<prd>",text)
    text = re.sub(" " + alphabets + "[.]"," \\1<prd>",text)
    if "”" in text: text = text.replace(".”","”.")
    if "\"" in text: text = text.replace(".\"","\".")
    if "!" in text: text = text.replace("!\"","\"!")
    if "?" in text: text = text.replace("?\"","\"?")
    text = text.replace(".",".<stop>")
    text = text.replace("?","?<stop>")
    text = text.replace("!","!<stop>")
    text = text.replace("<prd>",".")
    sentences = text.split("<stop>")
    sentences = sentences[:-1]
    sentences = [s.strip() for s in sentences]
    return sentences


liste= split_into_sentences(text)

yeniliste = liste.copy()
kaliplar = []
kalip = []
#print(yeniliste)
def kalip_arama(kaliplar):

    kalip = [] 
    kaliplar = []# bu iki listeyi neden dışarıda kabul etmeyip,
                #hem dışarıda hem içeride istiyor anlamadım.
    
    for i in liste:
        metin = i.split()
        
        del yeniliste[0]
        
        for t in yeniliste:
            dizi = t.split() 
                        
            for p in metin:
                if p in dizi and p not in kalip:
                    kalip.append(p)
                    
                if p not in dizi:
                    if kalip != []:
                        if kalip[-1]!="£":
                            kalip.append("£")# arada başka kelime olan kalıpları da almak için,
                                             #o "başka kelime" yerine "£" ekliyorum
                    #kalip = dict.fromkeys(kalip)# tekrarları önlemek için dict yapıyoruz
                    # kalıplar listesine ekliyoruz
                    if len([x for x in kalip if x is not "£"])>1: # kalıp en az iki kelime olmalı
                        if " ".join(kalip) not in kaliplar:
                            kaliplar.append(" ".join(kalip))# tekrarları önlemek için
                            

            del kalip[:]
            
    return kaliplar   
    
kalıplar_2 = []
kalıplar_3 = []
for i in kalip_arama(kaliplar):
    f=i.count(" £ ")
    if f<1:
        kalıplar_2.append(i)
print(kalıplar_2)
kalıplar_2 = """['Python programlama dili £', 'Elinizdeki kitap, £',
'Python programlama £', 'Bu kitabın £', 'ayrıntılı ve £', 'bir şekilde £',
'sizin de £', 'bu kitaptaki £', 'daha kolay £', 'bir konuya £',
'konuya ilişkin bütün £', 'da daha £', 'Üstelik bir £', 'bir konuyu £']
 """
for i in kalıplar_2:
    i = i[:-2]        
    kalıplar_3.append(i)
print(kalıplar_3)
kalıplar_3 = ['Python programlama dili', 'Elinizdeki kitap,', 'Python programlama',
         'Bu kitabın', 'ayrıntılı ve', 'bir şekilde', 'sizin de', 'bu kitaptaki',
         'daha kolay', 'bir konuya', 'konuya ilişkin bütün', 'da daha',
         'Üstelik bir', 'bir konuyu']

Şimdi bu kodları hem kısaltıp, hem de sonucu sözlük olarak almam gerekiyor, en çok tekrar sayılarını bulmak için. Bunun için sizin scriptinizi anlamaya çalışıyorum.

Bu arada, acaba tanıdığınız bilişsel mimari (cognitive architect) çalışan biri var mı?

Sizin yapmaya çalıştığınız programın zaman alan kısmı ‘baş şehridir’ gibi bölümleri de istemeniz. Belli bir ayırma kuralınız olmadığı ve ne arayacağınızı bilmediğiniz için bu şekilde ard arda kelimelerin hepsini bulmak zor. Bu kod sadece ayrı kelimeler için istediğiniz gibi çalışmaktadır:

liste= ["londra kutbuna kuzey baş şehridir",
          "italya çizmeye benzer",
          "venedik italyanın bir şehridir",
          "paris fransanın baş baş şehridir",
          "finlandiya baş şehridir kuzey kutbuna yakındır"]

dizi_kümesi = [set(i.split()) for i in liste]

sonuç = []
boş_küme = set()


for i in range(len(dizi_kümesi)):
    for j in range(len(dizi_kümesi)):
        inter = dizi_kümesi[i].intersection(dizi_kümesi[j])
        if  inter != boş_küme and i!=j:
            sonuç.append(inter)

sözlük = {}
for i in sonuç:
    for j in i:
        try:
            sözlük[j] += 1
        except KeyError:
            sözlük[j] = 1

permütasyon = {i*(i-1):i for i in range(100)}

sonuç_sözlük = {}
for i,j in sözlük.items():
    sonuç_sözlük[i] = permütasyon[j]

print(sonuç_sözlük)

Üstteki arkadaşın dediği gibi, girdileri ve amaçları daha net bir şekilde paylaşırsanız ona göre bir çözüm bulunabilir.

güzel çözüm kendi algoritmamam için kullandım, teşekkürler