2017-01-08 33 views
6

Như tiêu đề nói:Tôi đang cố gắng để đếm tất cả các chữ trong một file txt sau đó hiển thị theo thứ tự giảm dần

Cho đến nay đây là nơi tôi đang ở mã của tôi không làm việc tuy nhiên tôi đang gặp khó khăn hiển thị thông tin theo thứ tự. Hiện tại nó chỉ hiển thị thông tin một cách ngẫu nhiên.

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])) 

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

1

Hiển thị theo thứ tự giảm dần cần nằm ngoài vòng lặp tìm kiếm của bạn nếu không chúng sẽ được hiển thị khi chúng gặp phải.

Phân loại theo thứ tự giảm dần là khá dễ dàng bằng cách sử dụng built-in sorted (bạn sẽ cần phải đặt reverse -argument!)

Tuy nhiên python là pin bao gồm và đã có một Counter. Vì vậy, nó có thể là một cách đơn giản như:

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) 

The Counter đã có một phương pháp most_common nhưng bạn muốn hiển thị tất cả các ký tự và số lượng vì vậy nó không phù hợp trong trường hợp này. Tuy nhiên nếu bạn chỉ muốn biết số x phổ biến nhất thì nó sẽ phù hợp.

5

Từ điển là cấu trúc dữ liệu không có thứ tự. Ngoài ra, nếu bạn muốn đếm một số mục trong một tập hợp dữ liệu bạn nên sử dụng collections.Counter() được tối ưu hóa và linh hoạt hơn cho mục đích này.

Sau đó, bạn chỉ có thể sử dụng Counter.most_common(N) để in hầu hết các mục phổ biến trong đối tượng Số lượt truy cập của mình là N.

Cũng liên quan đến việc mở tệp, bạn có thể chỉ cần sử dụng câu lệnh with tự động đóng tệp ở cuối khối. Và tốt hơn là không in kết quả cuối cùng bên trong chức năng của bạn thay vào đó, bạn có thể làm cho chức năng của bạn trở thành một máy phát điện bằng cách sử dụng các dòng dự định và sau đó in chúng ngay cả khi bạn muốn.

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) 

Sau đó sử dụng một vòng lặp for để lặp qua các chức năng máy phát điện:

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

Bạn không cần phải để lặp qua 'lời', và sau đó qua bức thư trong đó. Khi bạn lặp qua một chuỗi (như content), bạn sẽ có các ký tự đơn (chiều dài 1 chuỗi). Sau đó, bạn sẽ muốn đợi cho đến sau vòng đếm của bạn trước khi hiển thị đầu ra. Sau khi đếm, bạn có thể tự sắp xếp:

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

Tuy nhiên, sử dụng tốt hơn collections.Counter:

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

Bạn có thể sắp xếp từ điển của bạn tại thời điểm bạn in, với sorted phương pháp:

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: Tôi đã sử dụng phương thức thay đổi setdefault để đặt giá trị mặc định là 0 khi chúng ta gặp một bức thư lần đầu tiên

Các vấn đề liên quan