2013-07-28 5 views
-3

, 나는 프로그램을 작성할 필요가 얼마나 많은있는 인쇄, 모든 문자를 계산합니다. 텍스트의 모든 문자에 대해 텍스트에 나오는 횟수를 인쇄합니다. 인쇄물에서 문자는 텍스트에 나타나는 순서대로 나타나야하지만 문자는 두 번 나타나지 않아야합니다. 모든 문자는 대문자 또는 소문자로 표시되는 TOTAL 횟수를 표시해야합니다 (대문자와 소문자를 따로 계산하거나 표시하지 마십시오). 공백과 문장 부호도 계산해야합니다. 예 :다음 문자 파이썬에서

입력 할 경우 'hello world!'

t: 3 
o: 1 
d: 2 
a: 2 
y: 2 
    : 3 
i: 2 
s: 2 
u: 1 
e: 1 

나는 비교적 새로운 그리고 난 이것에 대해 이동하는 방법을 잘 모르겠어요 : 그것은 인쇄해야합니다 '가 화요일 오늘

를 입력하여
h: 1 
e: 1 
l: 3 
o: 2 
    : 1 
w: 1 
r: 1 
d: 1 
!: 1 

: 그것은 인쇄해야합니다.

+0

숙제 같은 소리. – erewok

+1

당신이 새로운 사람이기 때문에 나는 SO가 정말로 "여기에 과제가있다. 나를 위해 해결해 달라"는 사이트가 아니라고 설명해야한다. 코드와 관련하여 발생하는 개별적인 문제를 해결할 수있어서 기쁘게 생각합니다. 그러나 코드를 게시하지 않았습니다. 부수적으로, 당신이 얻게 될 답 중 많은 것들이 당신이 그것을 쓰지 않았다는 것을 즉시 명백하게 할 것입니다. (당신은 또한 SO 질문이 Google에 아주 높게 평가된다는 것을 알아야합니다. 이미 많은 문구를 검색하면 문제가 발생하지 않을 수도 있습니다.) – DSM

+0

@DSM 알고 있습니다. 그런 식으로 밝혀지는 것을 의미합니다. 나는 내가 지침이 아닌 답을 찾고 있다고 명시해야했다. –

답변

0

는이 경우 collections.Counter는 소용이되지 않을 수도 있습니다, 숙제처럼 소리 유익하고 또한 답변 대신 지침을 제공하는 것이 왜 가치가 있는지에 대해 알아보십시오.

우선, 고유 값을 계산해야합니다. 입력이 있다면 고유 한 값은 어떻게 얻습니까?

답변 : 세트를 사용하십시오.

>>> sample = [1, 3, 6, 7, 7, 7, 7, 8] 
>>> set(sample) 
{8, 1, 3, 6, 7} 
# Notice: the order has been thrown away 
>>> newsample = 'LollaPAloOza' 
>>> set(newsample) 
{'a', 'A', 'L', 'l', 'o', 'O', 'z', 'P'} 
# Notice: lowercase and uppercase are treated as different characters. 

새로운 질문 : 어떻게 소문자와 대문자를 동일하게 처리합니까?

답 : 그것은 소문자 나 대문자로 만들기 위해 모든 입력을 수정

>>> set(newsample.lower()) 
{'a', 'p', 'z', 'l', 'o'} 

우리는 지금 계산하는 고유 값의 집합을 가지고있다. 다음 문제 : 우리는 어떻게 이러한 것들을 계산합니까?

답 : 우리는 (A의 루프 사용) 세트를 반복 한 다음 우리의 세트의 각 항목에 셀 수 :

my_input = newsample.lower() 
for item in set(my_input): 
     print(my_input.count(item)) 
# the trick here is to iterate through the unique values and for each element, 
# to count the item that appears in the _whole_ (now lowercase) input. 

마지막으로, 우리가 항목을 저장하기 위해 일부 데이터 구조를 만들 필요를 그들의 카운트. 사전을 사용하면 좋은 방법이 될 수도 있고, 표시된 순서대로 답변이 필요하기 때문에 목록을 작성하고 각 항목을 목록의 각 항목과 연관시키는 것이 좋습니다.

그러나 사용이 가능하면이 모든 작업은 collections.Counter에 의해 수행됩니다.

4

사용 collections.Counter :

>>> from collections import Counter 
>>> Counter('hello world!') 
Counter({'l': 3, 'o': 2, '!': 1, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1}) 

당신이 순서를 유지하려는 통지를하지 않았다. 당신은 그것을 위해해야 ​​언급

>>> from collections import OrderedDict 
>>> 
>>> class OrderedCounter(Counter, OrderedDict): 
...  def __repr__(self): 
...   return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) 
...  def __reduce__(self): 
...   return self.__class__, (OrderedDict(self),) 
... 
>>> 
>>> count = OrderedCounter('hello world!') 
>>> count 
OrderedCounter(OrderedDict([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1), ('!', 1)])) 
+0

출력은 문자가 나타나는 순서대로 이루어져야하지만 반복은 없어야합니다. –

+0

@PrestonMay. 수정 된 답변 –

7

을, 그래서 당신은 collections 문서에서 OrderedCounter 요리법, 예를 수행 할 수 있습니다 :이를 위해 당신은 collections 모듈 문서에서 OrderedCounter 예를 사용할 수 있습니다

다음
from collections import OrderedDict, Counter 

class OrderedCounter(Counter, OrderedDict): 
    'Counter that remembers the order elements are first encountered' 

    def __repr__(self): 
     return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) 

    def __reduce__(self): 
     return self.__class__, (OrderedDict(self),) 

letter_counts = OrderedCounter('hello world!') 
# OrderedCounter(OrderedDict([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1), ('!', 1)])) 

돌출을 그 돌이 :

for letter, count in letter_counts.items(): 
    print letter, count 
+0

+1 좋은 하나, 하나의 작은 발언, 나는 당신이 생성에 낮추기 위해 문자열을 돌려 주어야한다고 생각한다. –

+0

@RomanPekar 예 - OP가 단지 원하는 동작 인 경우 문자열에서'.lower()'를 수행 할 수 있다고 생각한다;) –

0

두 답변 모두 OrderedCounter의 멋진 예제를 제공하지만 나는 새로운 클래스가 소문자로 처리해야하므로 질문에 대한 완전한 답이 아니라고 생각합니다. Sor 여기에 내 2 센트입니다 :

from collections import Counter, OrderedDict 

class OrderedCounter(Counter, OrderedDict): 
    'Counter that remembers the order elements are first encountered' 
    def __init__(self, iterable, **kwds): 
     if "lower" in dir(iterable): it = iterable.lower() 
     else: it = iterable 

     return super(OrderedCounter, self).__init__(it, **kwds) 

    def __repr__(self): 
     return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) 

    def __reduce__(self): 
     return self.__class__, (OrderedDict(self),) 
+0

음 ... 과잉 공격은 새로운'__init__'을 넣는 것 같습니다 .... –

+0

왜 과장인가? (iterable, 'lower', lambda : iterable) 'OrderedCounter (오늘은 화요일! "lower())'와 그냥'OrderedCounter ("오늘 화요일! ")'처럼 호출 할 필요가없는 것과 같이 새로운 클래스를 수정하는 또 다른 방법이 있을까요? –

+0

당신은 그저 단순한 커스텀 함수처럼 새로운'class'를 필요로하지 않습니다 ...'def somename (text) : OrderedCounter (text.lower())'를 돌려줍니다. 정말로 문자열에서만 작동하도록하고 싶다면'basestring' 등이 아니라면 예외를 발생시켜야합니다 ... –