2017-01-08 17 views
6

azalan gösterilecek ediyorum diyor ki:Sonra bir txt dosyasında tüm harfleri saymak için çalışıyor başlık olarak sipariş

ancak ben sorun bilgileri görüntüleyen yaşıyorum çalışır benim kod neresi diye Şimdiye kadar bu sırayla. Şu anda sadece bilgileri rastgele görüntüler.

def frequencies(filename): 
    infile=open(filename, 'r') 
    wordcount={} 
    content = infile.read() 
    infile.close() 
    counter = {} 
    invalid = "‘'`,.?!:;-_\n—' '" 

    for word in content: 
     word = content.lower() 
     for letter in word: 
      if letter not in invalid: 
       if letter not in counter: 
        counter[letter] = content.count(letter) 
        print('{:8} appears {} times.'.format(letter, counter[letter])) 

Herhangi bir yardım çok takdir edilecektir.

cevap

1

azalan sırada gösteriliyor aksi takdirde onlar karşılaşılan olarak gösterilecektir arama-döngü dışında olması gerekir.

azalan sırada sıralama kullanarak oldukça kolaydır yerleşik sorted (eğer reverse -argument ayarlamak gerekir!)

Ancak piton piller dahil ve zaten bir Counter olmasıdır.

from collections import Counter 
from operator import itemgetter 

def frequencies(filename): 
    # Sets are especially optimized for fast lookups so this will be 
    # a perfect fit for the invalid characters. 
    invalid = set("‘'`,.?!:;-_\n—' '") 

    # Using open in a with block makes sure the file is closed afterwards. 
    with open(filename, 'r') as infile: 
     # The "char for char ...." is a conditional generator expression 
     # that feeds all characters to the counter that are not invalid. 
     counter = Counter(char for char in infile.read().lower() if char not in invalid) 

    # If you want to display the values: 
    for char, charcount in sorted(counter.items(), key=itemgetter(1), reverse=True): 
     print(char, charcount) 

Sayaç zaten most_common yöntemi vardır ama bu durumda uygun olmadığını bu yüzden tüm karakterleri ve sayılarını görüntülemek istiyorum: Yani kadar basit bir şekilde olabilir. Bununla birlikte, sadece x en yaygın sayıları bilmek istiyorsanız, o zaman uygun olur.

5

Sözlükler sıralanmamış veri yapılarıdır. Ayrıca, bir takım veri içerisindeki bazı öğeleri saymak isterseniz, bu amaç için daha iyi optimize edilmiş ve pythonic olan collections.Counter()'u daha iyi kullanabilirsiniz.

Sayaç nesnenizdeki çoğu N ortak öğeyi yazdırmak için Counter.most_common(N)'u kullanabilirsiniz.

Ayrıca dosyaların açılmasıyla ilgili olarak, sadece otomatik blok sonunda dosyayı kapatır with deyimi kullanabilirsiniz. Ve hatta istediğiniz zaman onları baskı daha sonra amaçlanan çizgiler elde ve ederek fonksiyonunu bir jeneratör yapabilir, bunun yerine işlevi içinde nihai sonucu yazdırmak değil daha iyidir.

from collections import Counter 

def frequencies(filename, top_n): 
    with open(filename) as infile: 
     content = infile.read() 
    invalid = "‘'`,.?!:;-_\n—' '" 
    counter = Counter(filter(lambda x: not invalid.__contains__(x), content)) 
    for letter, count in counter.most_common(top_n): 
     yield '{:8} appears {} times.'.format(letter, count) 

Sonra jeneratör işlevi üzerinde yineleme için döngü için kullanın:

for line in frequencies(filename, 100): 
    print(line) 
4

Sen 'kelimeleri' yineleme gerekir ve daha sonra onları harflerin üzerine yoktur. Eğer bir dize (gibi content) üzerinden yineleme zaman, zaten tek karakter (uzunluk 1 dizeleri) sahip olacaktır. Ardından, çıkış göstermeden önce sayım döngüsünden sonra beklemek isteyebilirsiniz. sayılmasından sonra el sıralama olabilir: Ancak

for letter, count in sorted(counter.items(), key=lambda x: x[1], reverse=True): 
    # do stuff 

, daha iyi kullanım collections.Counter: Sen yazdırmak anda sözlüğünü sıralayabilirsiniz

from collections import Counter 

content = filter(lambda x: x not in invalid, content) 
c = Counter(content) 
for letter, count in c.most_common(): # descending order of counts 
    print('{:8} appears {} times.'.format(letter, number)) 
# for letter, number in c.most_common(n): # limit to n most 
#  print('{:8} appears {} times.'.format(letter, count)) 
0

, sorted yöntemiyle:

lettercount = {} 
invalid = "‘'`,.?!:;-_\n—' '" 
infile = open('text.file') 
for c in infile.read().lower(): 
    if c not in invalid: 
     lettercount[c] = lettercount.setdefault(c,0) + 1 
for letter in sorted(lettercount): 
    print("{} appears {} times".format(letter,lettercount[letter])) 

RMQ: Ben ilk defa bir mektup tanıştığında 0 olarak varsayılan değeri ayarlamak için setdefault değişim yöntemi kullanmış

İlgili konular