2012-09-09 16 views
5

पायथन में, मैं एक टेक्स्ट फ़ाइल के माध्यम से कैसे पुन: प्रयास कर सकता हूं और प्रत्येक अक्षर की घटनाओं की संख्या को कैसे गिन सकता हूं? मुझे एहसास है कि मैं इसके माध्यम से जाने के लिए 'फ़ाइल में एक्स के लिए' कथन का उपयोग कर सकता हूं और फिर 26 या तो सेट अप कर सकता हूं अगर एलीफ स्टेटमेंट्स, लेकिन निश्चित रूप से ऐसा करने का एक बेहतर तरीका है?टेक्स्ट फ़ाइल में अक्षरों की गणना आवृत्ति

धन्यवाद।

+0

http://stackoverflow.com/search अन्य बातों भरोसा कर सकते हैं एक समारोह है ? q = [पायथन] + –

+1

गिनें [यहां] (http://stackoverflow.com/a/5148987/866571) इसी तरह के प्रश्न पूछे गए हैं। – Mayura

+0

[पाइथन में पत्र आवृत्ति] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5148903/letter-frequency-in-python) –

उत्तर

14

उपयोग collections.Counter():

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

@mgilson के रूप में मामले में, ने कहा अगर फाइल इतनी बड़ी नहीं है, तो आप बस कर सकते हैं:

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

उदाहरण:

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

या तार के count() विधि का उपयोग करें:

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

उस मामले के लिए: 'काउंटर (f.read()) 'चाल चलाना चाहिए यदि ओपी पूरी फाइल को स्मृति में पढ़ सकता है। – mgilson

+0

खूबसूरती से चलता है। धन्यवाद ! हालांकि, काउंटर (f.read()) विधि कुछ त्रुटियों को फेंकता है, डेटा को मिश्रित करने के बारे में मेरी फ़ाइलें लंबाई में लगभग 1000 वर्ण होने की संभावना है, इसलिए आकार कोई समस्या नहीं होनी चाहिए। – Muzz5

4

एक शब्दकोश का प्रयोग करें - मूल रूप से letters[char]++

0

काउंटर यह करने के लिए एक अच्छा तरीका है, लेकिन काउंटर 3.1 और ऊपर, प्लस 2.7 में ही उपलब्ध है।

यदि आप 3.0 या 2. पर हैं। [56], तो संभवतया आपको collections.defaultdict (int) का उपयोग करना चाहिए।

0

इस तरह प्रत्येक चरित्र है, जो एक बार चार्ट या इसी तरह बनाने के लिए इस्तेमाल किया जा सकता है के लिए एक हिस्टोग्राम शब्दकोश पैदा करता है। यदि आप इसे अक्षरों या कुछ सबसेट तक सीमित करना चाहते हैं, तो आपको अंत में एक अतिरिक्त सशर्त जोड़ने की आवश्यकता होगी, या अंत में freqs फ़िल्टर करना होगा।

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

print freqs 

मैंने माना है कि आपने फ़ाइल खोल दी है और सामग्री के साथ populated * file_list * खोला है।

+0

'has_key()' को हटा दिया गया है, 'इन' का उपयोग करें। –

+0

@ जेम्स-ब्रैडबरी 'अगर freqs में char' के बजाय freqs.keys() 'में char होना चाहिए। – MaxMarchuk

+0

@MaxMarchuk। यदि आप Python 2.x बात कर रहे हैं तो आप सही हैं, लेकिन पायथन 3 में आप कुंजी पर पुनरावृत्ति के लिए सरल, अधिक पठनीय रूप का उपयोग कर सकते हैं। –

1

मूल रूप से, आयात के बिना: is_letter अगर कुछ एक पत्र है तय करने के लिए, ताकि आप हमेशा की तरह अंग्रेज़ी अक्षरों से

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} 
संबंधित मुद्दे