Bir metnin içindeki her bir karakterin hangi sıklıkta yinelendiğini sayma

Başlatan mustafadalga, 07 Nisan 2017 - 06:34:59

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mustafadalga

Merhaba iyi çalışmalar arkadaşlar,
dışardan oluşturduğum bir metin dosyasını içeriye aktarıp ,metin dosyasındaki her bir karakterin kac defa yinelendiğini bulmak istiyorum.Program bir yere kadar calısıyor ,ondan sonra hata veriyor.Verdiği hata aşağıdaki gibi gözüküyor. Nerede hata yaptım,nasıl düzeltebilirim? yardımcı olur musunuz?,Teşekkürler.

kodlar;
metin=open("hakkında.txt")
metin=metin.readlines()

harfler=""
sayac=sayac2=0

for satir in metin:#satırları yazdırdık
    for karakterler in satir:#satırlardaki karakterleri teker teker yazdırıyoruz.
        for k in range(len(satir)): #satır uzunluğu kadar dönecek.
            if satir[k]==karakterler:#her bir karakterin kontrolünü yapıyoruz.
                sayac+=1#eğer aynı karakterler varsa sayacı artırıyoruz.
        if satir[sayac2] not in harfler:#karakterler birden fazla olduğunda her defasında yazdırmamak için sart koyduk.
            harfler+=satir[sayac2]
            print(satir[sayac2],"karakterinden",sayac,"tane bulunmaktadır.")
            sayac=0
        sayac2+=1






berkayaslan

sayac2 degerin bir yerden sonra listenin uzunlugundan daha fazla oluyor. Bu yuzden ona ulasirken hata aliyorsun. Ornegin icinde 10 eleman olan bir listenin 11. elemanini sorguluyorsun. 

Kodu tam incelemedim ama listelerin indexlerinin 0'dan basladigini unutmus olup ona gore kodu yazmis olabilirsin. Ama dedigim gibi su an pek musait olmadigimdan koda tam bakamadim
İf you wanna be the best, You must SMURF something. :)

mustafadalga


natgho

Kodu biraz evirerek şöyle bir yapı kurdum,
# Coded by Sezer Yavuzer Bozkır <admin@sezerbozkir.com>
# Date: 11.04.2017
# from string import printable

from collections import OrderedDict

text = open("sample.txt", "r").read()
counter = OrderedDict()

for char in text:
    if char not in counter.keys():
        counter[char] = 1
    else:
        counter[char] += 1
for key, value in counter.items():
    print("{} karakterinden {} tane var.".format(key, value))
Sizin kodunuzun ise patlamaasının nedeni muhtemelen sondaki boş satır. readlines() metodu ile okuttuğunuz için, kod o satıra gidiyor, ancak içerisinde 0 değer olduğundan sorgulanacak değer göremiyor ve "out of range" hatası alıyorsunuz.
Yine bir başka olası durum ise, "sayac=sayac2=0" kullanmış olmanız. o kısmı şöyle çevirirseniz kodunuz çalışıyor(elimde hakkinda.txt olmadığından örnek başka bir metinle test ettim, ekstra boşluk koymayarak.):
sayac = 0
sayac2 = 0
Bunun da sebebi sayac ve sayac2'yi birbirine eşitliyor oluşunuz. Muhtemelen bu sebepten python arka tarafta bu değerlerin pointer'larınıda eşitlemekte, dolayısıyla siz bir değer artırımı yaptığınızda, otomatik olarak diğer değer de artmakta. eğer tek satırda eşitleme yapacaksanız(ki bu işlem kodun okunaklığını azaltır);
sayac1, sayac2 = 0, 0
Hayır ben Windows Düşmanı Değilim,Bu Yüzden Linux Kullanmıyorum, Ben Sadece Benim Donanımımda At Koşturacaksa Bir Yazılım, her Adımını Bilme Sorumluluğunu Hisseden Bir Teknologtan Fazlası olmadığım İçin Linux Kullanıcısıyım.

mustafadalga

yardımcı olduğunuz için teşekkürler yazdığınız kodlar da bazı yerlerde daha öğrenmediğim şeyler var.
O aşamaya gelmedim ondan bu yolla yapmaya çalıştım.
Sorunu bu yöntemle çözdüm.Artık diğer arkadaşlarda faydalanır :) teşekkürler.

metin=open("hakkında.txt")
metin=metin.readlines()

dosya = open('hakkında.txt')
karakterler = dosya.read()
karakter_sozlugu = {}
for karakter in karakterler:
    if not karakter in karakter_sozlugu:
        karakter_sozlugu[karakter] = 1
    else:
        karakter_sozlugu[karakter] += 1
for karakter in karakter_sozlugu:
    print('{} karakterinden {} adet var'.format(karakter, karakter_sozlugu[karakter]))
dosya.close()


natgho

Sizin kodunuz daha Unix standartlarında olmuş, ben biraz (nerdlerin tabiriyle) pythonic bir kod yazmaya gayret ettim, sonuç doğru olduğu sürece problem yok demektir. iyi çalışmalar :)
Hayır ben Windows Düşmanı Değilim,Bu Yüzden Linux Kullanmıyorum, Ben Sadece Benim Donanımımda At Koşturacaksa Bir Yazılım, her Adımını Bilme Sorumluluğunu Hisseden Bir Teknologtan Fazlası olmadığım İçin Linux Kullanıcısıyım.