2013-09-04 4 views
0

나는 주파수에 따라 가장 낮은 것부터 가장 낮은 것으로 표시하는 것보다 텍스트 파일에서 문자의 발생 횟수를 세는 방법을 찾고 있습니다. 이것은 내가 지금까지 가지고있는 것입니다,이 뇌간을 극복하도록 도와주세요.정렬 및 편지의 주파수 구성 - 파이썬

def me(): 
    info= input("what file would you like to select?") 
    filehandle= open(info,"r") 
    data=filehandle.read() 
    case = data.upper() 
    s=('ABCDEFGHIJKLMNOPQRSTUVWXYZ') 
    for i in range(26): 
     print(s[i],case.count(s[i])) 



me() 
+0

정확히 문제가 무엇입니까 당신은 일종의 그 후 인쇄가, 목록에있는 수를 절약 할 수있다? –

+0

문제 없음 나는 단지 내가 내놓은 것을 어떻게 받아 들일 수 있는지를보고 있는데, 가장 낮은 곳에서 가장 낮은 곳에 놓는다. –

답변

2

collections.Counter하고 most_common() 방법에 대해 정확히 무엇 : 표준 유닉스 단어를

d={} 
with open('/usr/share/dict/words') as f: 
    for line in f: 
     for word in line.split(): 
      word=word.strip() 
      for c in word: 
       d[c]=d.setdefault(c,0)+1 

for k, v in sorted(d.items(), key=lambda t: t[1], reverse=True): 
    print k,v 

는, 인쇄 파일 :

import collections 
import string 

def me(): 
    info = input("what file would you like to select? ") 
    filehandle = open(info, "r") 
    data = filehandle.read().upper() 
    char_counter = collections.Counter(data) 
    for char, count in char_counter.most_common(): 
     if char in string.ascii_uppercase: 
      print(char, count) 

me() 

Counter은 다른 항목 (이 경우 문자)의 출현 횟수를 계산하는 사전입니다. char_counter.most_common()은 모든 문자 쌍을 정렬 된 순서로 제공합니다.

편지에만 관심이 있으므로 문자가 string.ascii_uppercase인지 확인합니다. 이것은 단순히 A에서 Z까지의 문자 스트링입니다.

+0

도와 주셔서 감사합니다. flornquake 당신이 여기서 한 일을 이해하도록 도와 줄 수 있습니까? –

2

파이썬에는 collections.Counter에 대한 내장 클래스가 있습니다.

In [8]: from collections import Counter 

In [9]: with open('Makefile', 'r') as f: 
    ...:  raw = Counter(f.read()) 
    ...: 

In [10]: raw 
Out[10]: Counter({' ': 61, 'e': 46, 'p': 38, 'a': 29, '\n': 27, 'c': 27, 'n': 27, 'l': 26, 'd': 25, '-': 22, 's': 22, 'y': 22, 't': 20, 'i': 18, 'o': 18, 'r': 17, '.': 16, 'u': 13, '\t': 12, 'm': 12, 'b': 11, 'x': 10, 'h': 9, '/': 8, ':': 8, '_': 7, "'": 6, ';': 5, '\\': 5, 'f': 5, '*': 3, 'v': 3, '{': 3, '}': 3, 'k': 2, 'H': 1, 'O': 1, 'N': 1, 'P': 1, 'Y': 1, 'g': 1}) 

은 BTW의 pandas 라이브러리의 Makefile에서입니다. 내림차순 빈도별로 정렬하려면 어떻게 : 당신이 시도하고 문제를 내 솔루션을 적용 할 수 있도록 내가 의도적으로 정확한 데이터를 사용하지 않는

In [22]: raw.most_common() 
Out[22]: 
[(' ', 61), 
('e', 46), 
('p', 38), 
('a', 29), 
('\n', 27), 
('c', 27), 
('n', 27), 
('l', 26), 
('d', 25), 
('-', 22), 
('s', 22), 
('y', 22), 
('t', 20), 
('i', 18), 
('o', 18), 
('r', 17), 
('.', 16), 
('u', 13), 
('\t', 12), 
('m', 12), 
('b', 11), 
('x', 10), 
('h', 9), 
('/', 8), 
(':', 8), 
('_', 7), 
("'", 6), 
(';', 5), 
('\\', 5), 
('f', 5), 
('*', 3), 
('v', 3), 
('{', 3), 
('}', 3), 
('k', 2), 
('H', 1), 
('O', 1), 
('N', 1), 
('P', 1), 
('Y', 1), 
('g', 1)] 

.

+0

'raw.most_common()'은 가장 일반적인 것부터 가장 적은 것까지 정렬하는 항목의 목록을 반환한다. 따라서 정렬 단계를 건너 뛸 수 있습니다. –

+0

잘 알고 있습니다. 감사. –

0

이것은 매우 숙제처럼 보입니다 ... 많이. 그리고이 웹 사이트를 제대로 사용하기를 바랍니다. 그러나 당신이 바른 곳으로 왔기 때문에 기쁩니다. 그리고 이번에는 적어도 당신을 도우려고 노력할 것입니다.

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> input_txt = "Now you are just somebody that I used to know" 
>>> for letter in input_txt: 
...  d[letter] += 1 
... 
>>> import operator 
>>> sorted_d = sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True) 
>>> sorted_d 
[(' ', 9), ('o', 6), ('t', 4), ('e', 3), ('s', 3), ('u', 3), ('a', 2), ('d', 2), ('w', 2), ('y', 2), ('b', 1), ('I', 1), ('h', 1), ('k', 1), ('j', 1), ('m', 1), ('N', 1), ('r', 1), ('n', 1)] 
0

이러한 라인을 따라 뭔가를 할 수 :

e 234413 
i 200536 
a 196995 
o 170062 
r 160269 
... 
Y 139 
X 92 
Q 77 
- 2    
+0

'd.most_common()'은 가장 일반적인 항목에서 가장 적은 항목 순으로 항목 목록을 반환합니다. 따라서 정렬 단계를 건너 뛸 수 있습니다. –

+0

@StevenRumbalski : 'Counter'의 인스턴스를 사용하는 경우에만 해당됩니다. 파이썬 기본 dict에는'.most_common()'메소드가 없습니다. – dawg

+0

와우. 나는 네가 대답 한 것을 '카운터'라고 생각하는 것을 잘못 읽었다. 나는 아마도 다른 대답을 읽고 우연히 당신 것에 대해 논평했다고 생각합니다. –

0

다른 사람들은 이미 itertools.Counter을 사용하여 더 나은 해결책을 제시했지만 코드는 가깝습니다. 정렬 된 출력을 즉시 인쇄 할 수 없습니다.

def me(): 
    info = input("what file would you like to select?") 
    filehandle = open(info,"r") 
    data = filehandle.read() 
    case = data.upper() 
    s = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ') 
    result = [] 
    for i in range(26): 
     result.append((s[i], case.count(s[i]))) 
    return result 

result = me() 
for letter, count in sorted(result, key=lambda x: x[1], reverse=True): 
    print(letter, count) 

아직도 당신의 논리를 사용하여, 당신은 기능이 더 읽기 쉽게 만들 수 있습니다 :

import string 

def me(): 
    info = input("what file would you like to select?") 
    filehandle = open(info,"r") 
    data = filehandle.read() 
    case = data.upper() 
    result = [] 
    for letter in string.uppercase: 
     result.append((letter, case.count(letter))) 
    return result