2012-09-09 31 views
5

Trong trăn, làm thế nào tôi có thể lặp qua một tệp văn bản và đếm số lần xuất hiện của mỗi chữ cái? Tôi nhận ra tôi chỉ có thể sử dụng một 'cho x trong tập tin' tuyên bố để đi qua nó và sau đó thiết lập 26 hoặc hơn nếu tuyên bố elif, nhưng chắc chắn có một cách tốt hơn để làm điều đó?Đếm tần số của các chữ cái trong một tệp văn bản

Cảm ơn.

+0

http://stackoverflow.com/search ? q = [python] + số –

+1

[Ở đây] (http://stackoverflow.com/a/5148987/866571) là câu hỏi tương tự được hỏi. – Mayura

+0

có thể trùng lặp của [Tần số thư trong python] (http://stackoverflow.com/questions/5148903/letter-frequency-in-python) –

Trả lời

14

Sử dụng collections.Counter():

from collections import Counter 
with open(file) as f: 
    c = Counter() 
    for x in f: 
     c += Counter(x.strip()) 

Như @mgilson chỉ ra, trong trường hợp nếu các tập tin không phải là quá lớn, bạn chỉ có thể làm:

c = Counter(f.read().strip()) 

ví dụ:

>>> c = Counter() 
>>> c += Counter('aaabbbcccddd eee fff ggg') 
>>> c 
Counter({'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3}) 
>>> c += Counter('aaabbbccc') 
Counter({'a': 6, 'c': 6, 'b': 6, ' ': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3}) 

hoặc sử dụng các phương pháp count() của chuỗi:

from string import ascii_lowercase  # ascii_lowercase =='abcdefghijklmnopqrstuvwxyz' 
with open(file) as f: 
    text = f.read().strip() 
    dic = {} 
    for x in ascii_lowercase: 
     dic[x] = text.count(x) 
+0

cho rằng vấn đề: 'Counter (f.read())' nên làm các trick nếu OP có thể đủ khả năng để đọc toàn bộ tập tin vào bộ nhớ. – mgilson

+0

Chạy đẹp mắt. Cảm ơn ! Tuy nhiên, phương thức Counter (f.read()) đưa ra một số lỗi, về việc trộn dữ liệu Các tệp của tôi có thể dài khoảng 1000 ký tự, do đó kích thước không phải là vấn đề. – Muzz5

4

Sử dụng một cuốn từ điển - về cơ bản letters[char]++

0

Counter là một cách tốt để làm điều này, nhưng Counter chỉ có sẵn trong 3,1 trở lên, cộng với 2,7.

Nếu bạn đang sử dụng 3.0 hoặc 2. [56], bạn có thể nên sử dụng collections.defaultdict (int) thay thế.

0

Cách này tạo biểu đồ từ điển cho mỗi ký tự , có thể được sử dụng để tạo biểu đồ thanh hoặc tương tự. Nếu bạn muốn giới hạn nó thành chữ cái hoặc một số tập hợp con, bạn sẽ cần thêm một điều kiện bổ sung hoặc lọc freqs ở cuối.

freqs = {} 
for line in file_list: 
    for char in line: 
     if char in freqs: 
      freqs[char] += 1 
     else: 
      freqs[char] = 1 

print freqs 

Tôi giả định bạn đã mở tệp và tệp * file_list * với nội dung.

+0

'has_key()' đã không được chấp nhận, sử dụng 'in'. –

+0

@ james-bradbury Nó sẽ là 'nếu char trong freqs.keys()' thay vì 'nếu char trong freqs'. – MaxMarchuk

+0

@MaxMarchuk. Bạn đúng nếu chúng ta đang nói Python 2.x, nhưng trong Python 3 bạn có thể sử dụng biểu mẫu đơn giản hơn, dễ đọc hơn để lặp qua các khóa. –

1

về cơ bản, mà không cần nhập khẩu: is_letter là một chức năng để quyết định xem cái gì đó là một bức thư, để bạn có thể đếm những thứ khác hơn các chữ cái tiếng Anh thông thường

def add_or_init(dictionary, c): 
     if(c in dictionary): 
       dictionary[c]+=1 
     else: 
       dictionary[c]=1 
def count_one_letter(dictionary, c, is_letter): 
     if is_letter(c): 
       add_or_init(dictionary, c) 
def count_letters(dictionary, string, is_letter): 
     for c in string: 
       count_one_letter(dictionary, c, is_letter) 
     return dictionary 

#count all characters 
count_letters(dict(),'aaabbbcccddd eee fff ggg',lambda x: True) 
# => {'a': 3, ' ': 3, 'c': 3, 'b': 3, 'e': 3, 'd': 3, 'g': 3, 'f': 3} 
Các vấn đề liên quan