2011-08-30 2 views
2

(나는 모든 종류의 프로그래밍에 대해 아주 새로운 언어이므로 답변 할 때 가능한 한 구체적으로 작성하십시오) 문제점 : pythonchallenge.com 레벨 2를 해결하는 프로그램을 작성했습니다. 프로그램이 작동합니다 결과는 지저분합니다. 글자 수의 결과를보기 좋은 목록으로 정렬하고 싶습니다. sorted()를 사용하여 문자 수의 결과를 정렬하려고하면 모든 수를 제거하고 내 문자열에있는 문자 목록 만 제공합니다. 나는 각 캐릭터가 내 파일에 얼마나 있는지를 볼 수 있어야한다. 내가 그러한 인쇄 분류 (에서 charCount)로 분류() 함수를 추가하는 경우숫자 목록을 파이썬으로 정렬하기

>>> {'\n': 1219, '!': 6079, '#': 6115, '%': 6104, '$': 6046, '&': 6043, ')': 6186, ' 
(': 6154, '+': 6066, '*': 6034, '@': 6157, '[': 6108, ']': 6152, '_': 6112, '^': 
6030, 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'q': 1, 'u': 1, 't': 1, 'y': 1, '{': 6046 
, '}': 6105} 

내가 cmd를이 얻을 :

countstring = open('pagesource.txt').read() 

charcount = {} 

for x in countstring: 
    charcount[x] = charcount.get(x, 0) + 1 

print charcount 

이 내가 cmd를 얻을 무엇인가 : 어쨌든 여기에 코드입니다 :

>>> ['\n', '!', '#', '$', '%', '&', '(', ')', '*', '+', '@', '[', ']', '^', '_', 'a' 
, 'e', 'i', 'l', 'q', 't', 'u', 'y', '{', '}'] 

솔루션에 감사드립니다. 코드에 모든 사항을 설명하는 시간을내어 주시면 감사하겠습니다.

답변

3

실제로 휠을 다시 만들지 않고 Counter 클래스를 사용해야합니다.

charcount은 사전이고 사전에는 암시 적 정렬 순서가 없습니다. 따라서 정렬 할 수있는 목록으로 변환해야합니다. 해당 목록의 각 항목은 개수 및 문자가 tuple입니다.

charcount.items()은 이미 [('\n', 1219), ('!', 6079)]과 같은 목록을 제공합니다. 불행히도이 목록을 정렬하면 먼저 문자별로 정렬되고 그 다음에 (문자가 같은 경우) 다른 방식으로 정렬되지 않고 개수별로 정렬됩니다. 그러므로, 먼저 count를보고 sort에 알려주고 그 다음에 (만약 count가 같으면) key function이 필요하다. 다행히도, 우리의 핵심 기능은 정말 간단합니다. 그냥 튜플 주위에 스왑 : 다시 값을 교환 한 후 다음 정렬 [('\n', 1219), ('!', 6079)] 및 :

lambda (char,count): (count, char) 

또한, 우리는 같은 것을 얻기 위해, 값을 교환하는 지능형리스트를 사용할 수 있습니다.

charcount_list = sorted(charcount.items(), key=lambda (char,count):(count, char)) 

charcount_list 이제 될 것입니다 : 당신이 역순를 원하는 경우, 단순히 sortedreverse=True 인수를 지정

[('a', 1), ('e', 1), ('i', 1), ('l', 1), ('q', 1), ('t', 1), ('u', 1), ('y', 1), 
('\n', 1219), ('^', 6030), ('*', 6034), ('&', 6043), ('$', 6046), ('{', 6046), 
('+', 6066), ('!', 6079), ('%', 6104), ('}', 6105), ('[', 6108), ('_', 6112), 
('#', 6115), (']', 6152), (' (', 6154), ('@', 6157), (')', 6186)] 

.

+0

또는 적어도 2.7 이전 버전의 'defaultdict'. – agf

+0

그것은 못생긴 키 기능입니다. 원래 여기에있는 목록 이해력을 사용하거나 값과 키를 모두 정렬하려면 'itemgetter (1, 0)'을 사용하십시오. – agf

+0

@agf 왜 그 람다는 못생긴가? 모든 파이썬 프로그래머는 여기서 일어나는 일을 즉시 이해할 것입니다. 나는'itemgetter'를 사용하면 조금 더 짧아진다는 것에 동의한다. – phihag

0
sorted(charcount.items(), key=lambda item: item[1]) 
+0

charcount 대신 charcount.items()를 사용해야합니다 – steabert

0

charcountdict (사전)입니다. 사전을 반복하면 키가 반복되므로 그 결과로 sorted()이 정렬 된 키 목록이됩니다. 당신이 sorted에 사전을 통과 할 때 키의 정렬 된 목록을 얻을 수 있도록,

sorted(charcount.items(), key=lambda t: t[1]) 
0

사전이 키에 의해 반복된다

당신은 다음 두 번째 값을 정렬 할 항목의 목록을 얻을 필요가있다. 사전의 항목 튜플을 값으로 정렬하여 정렬 된 튜플 목록을 가져옵니다.파이썬 2.7 이상을 사용하는 경우

sorted_charcount = sorted(charcount.items(), key=lambda item: item[1]) 

는, 당신은 항목 튜플의 정렬 된 순서를 유지하는 것 OrderedDict을 초기화하는 튜플의 목록을 사용할 수 있습니다.

+0

그는 "문자 개수의 결과를 멋진 __list__로 정렬하고 싶습니다."라고 말했습니다. 또한 "사전을 정렬 할 수 없습니다."라는 말은 잘못되었습니다. 사전을 정렬 할 수 있습니다 (다른 모든 답변과 마찬가지로) 사전은 정렬되지 않습니다. – agf

+0

내 대답은 – Imran

+0

로 고정되었습니다.이 정확한 해결책을 제공하는 몇 가지 다른 답변이 이미 있습니다. – agf

0

사전 (what {} 의미)은 입니다. 정렬되지 않은 컬렉션입니다. 어떤 의미있는 방법 으로든 그들을 분류 할 수 없다는 것을 의미합니다. 정보를 튜플 [(), ...]의 목록으로 저장 한 다음이를 기반으로 정렬하는 것이 좋습니다.

foo = [('a', 123), ('b', 345)] 

def key_function(x): 
    return x[1] 

sorted_list = sorted(foo, key_function) 
print sorted_list 

여기서 알 수 있듯이 정렬 된 두 번째 매개 변수는 선택 사항입니다. 이 매개 변수의 목적은 을 정렬하는 함수를 제공하는 것입니다.을 정렬하는 방법. 목록에서 각 튜플의 정보를 분해하여 정렬 할 수있는 값을 제공하는 것은 의미있는 방식으로 튜플 목록을 실제로 지정할 수 없기 때문입니다.

의미가 있습니까? print sorted(foo, key=lambda (x,y): y)

람다 단지 이름이없는 인라인 함수를 의미하며, 그것은 당신이 다른 방법으로 튜플을 분해 할 수 있습니다 :

은 또한처럼 쓸 수 있습니다.

print [y for (x,y) in sorted_list]

을 수행하여 작동하는 방법 당신은 당신도 같이 앞에서 키 기능을 다시 정의 할 수 있습니다 볼 수 있습니다

def key_function(x): 
    x,y = x 
    return y 

BTW, 난 단지 명확성을 위해 전에 괄호에 넣어. 함수를 정의하지 않으면 쉼표는 터플 생성자입니다.

+0

정렬이 아니라 단지 키를 반환하기 때문에 실제로는 'key_function'이라고해야합니다. – agf

+0

@agf, 좋은 지적. 그것을 바꿨습니다. – Wes

2
>>> from operator import itemgetter 
>>> sorted(charcount.items(), key=itemgetter(1)) 
[('a', 1), ('e', 1), ('i', 1), ('l', 1), ('q', 1), ('u', 1), ('t', 1), ('y', 1), ('\n', 1219), ('^', 6030), ('*', 6034), ('&', 6043), ('$', 6046), ('{', 6046), ('+', 6066), ('!', 6079), ('%', 6104), ('}', 6105), ('[', 6108), ('_', 6112), ('#', 6115), (']', 6152), (' (', 6154), ('@', 6157), (')', 6186)] 
+0

이것은 깔끔하고 짧지 만 질문은 "각 캐릭터의 양이 내 파일에 얼마나 있는지 확인해야합니다."라고 묻습니다. – phihag

+0

@phihag, 예, 저는 그것을 보았습니다. –