2017-11-10 3 views
1

나는 어떤 가능한 방법이 있나요값을 가져 와서 사전의 값을 재 할당하는 방법은 무엇입니까?

Counter({'the': 0, 'to': 1, 'of': 2, 'independence': 3, 'puigdemont': 4, 'mr': 5, 'a': 6, 'spain': 7, 'for': 8}) 

처럼

Counter({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 

나는 기존의 값이 증가하는 순서로 각 요소의 값을 할당 할 같은 카운터 개체가?

미리 감사드립니다.

는 업데이트 :

(. 당신이 내 설명을 생략하고 아래의 예를 보려면 아래로 굴러 할 수 있도록 내 영어는 매우 좋지 않다) 죄송합니다, 내가 내 질문에 명확하게하지 않은 것 같다. 실제로 Counter 객체 전체가 훨씬 길어집니다. 개체는 단락에서 가져 오며 각 단어의 값은 해당 단락의 어커런스입니다. 내 단락의 단어를 사전의 해당 값으로 바꾸기위한 사전을 작성하려고합니다. 사전의 값은 내 단락의 단어 빈도에 따라 정렬되며 두 단어가 동일한 경우 알파벳 순서로 정렬됩니다.

예 :

문자열 = 문자열의 각 단어 발생 수 '연기 화재가있는 곳 "= 1, 2가 = 여기서 가 = 2, 화재 = 1, 화재 = 1이. 그래서 내가 같은 사전이 필요합니다

{“is”: 0, “there”: 1, ”fire”:2 , “smoke”: 3, “where”:4} 

가장 흔한 단어

이를 "입니다"하고 있지만, 알파벳 순으로, "i"가 "T"앞에 "가", 그래서 ""0이다 "거기"는 1입니다.

이것 좀 먹을 래?

매우 감사드립니다 !!

+2

은 무엇입니까 너를 막는거야? – jonatan

+3

'카운터'는 주문하지 않으므로 제안 사항은 거의 이해가되지 않습니다. 주문한 카운터를 만들 수도 있습니다. https://stackoverflow.com/questions/35446015/creating-an-ordered-counter –

+1

나중에 카운터를 다시 할당 했습니까? – Alexey

답변

0

주파수 다음 알파벳 순서로 단어를 분류 한 다음 각 단어에 대한 고유 키 할당과는 사전 생성하려면 :

from collections import Counter 

c = Counter({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 
res = {word: unique_id for unique_id, (_, word) in enumerate(
    sorted([(-freq, word) for word, freq in c.most_common()])) 
} 

print(res) 

출력 :

{'the': 0, 'to': 1, 'independence': 2, 'mr': 3, 'of': 4, 'puigdemont': 5, 'a': 6, 'for': 7, 'spain': 8} 

결과가 dict이므로 반드시 주문할 필요는 없습니다. (cpython 3.6에서는 순서가 정해지지 만, 의존하지 말아야 할 구현 세부 사항입니다.)

내부 정렬은 원하는 정렬 순서를 생성 할 (-freq, word) 튜플을 만드는 데 사용됩니다 . 외부 이해는 주파수 (키 - 값을 압축을 풉니 만 단어를 유지) 삭제 및 생성하는 열거 사용하는 고유 ID의

편집 : 순서는 출력에 필요한 경우 대신 사용

from collections import Counter, OrderedDict 

c = Counter({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 
res = OrderedDict((word, unique_id) for unique_id, (_, word) in enumerate(
    sorted([(-freq, word) for word, freq in c.most_common()])) 
) 

print(res) 
+0

OMG ... 그것은 작동합니다! 놀랄 만한! 정말 고맙습니다! 나는 당신의 코드를 이해하려고 노력할 것이다. – nimsbnims

0

당신이 필요로하는 것 인 OrderedDict :

from collections import Counter, OrderedDict 

data_dict = OrderedDict({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 
c1 = Counter(dict(zip(data_dict.keys(), range(len(data_dict))))) 
print(c2) 

출력 : 여기에

Counter({'for': 8, 'spain': 7, 'a': 6, 'mr': 5, 'puigdemont': 4, 'independence': 3, 'of': 2, 'to': 1, 'the': 0}) 

각 키 live example

+0

저에게 대답 해 주셔서 감사합니다. 그러나, 그것은 나를 위해 작동하지 않습니다 ... 자세한 내용은 내 질문을 업데이트했습니다. – nimsbnims

0

액세스 할 수 있으며 그 값 변경 :

from collections import Counter 

a_dict = Counter({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 

n = 0 
for d in a_dict:  
    a_dict[d] = n 
    n += 1 

>>> a_dict 
Counter({'for': 8, 'spain': 7, 'a': 6, 'mr': 5, 'puigdemont': 4, 'independence': 3, 'of': 2, 'to': 1, 'the': 0}) 
을 0

당신이 튜플의 정렬 된 목록과 함께 갈 수 있다면 그래서, 나는 당신의 의견에서 알고있는 것처럼

>>> sorted(a_dict.items(), key=lambda x: x[1]) 
[('the', 0), ('to', 1), ('of', 2), ('independence', 3), ('puigdemont', 4), ('mr', 5), ('a', 6), ('spain', 7), ('for', 8)] 
+0

저에게 대답 해 주셔서 감사합니다. 그러나, 그것은 나를 위해 작동하지 않습니다 ... 자세한 내용은 내 질문을 업데이트했습니다. – nimsbnims

0

, 당신은 정렬 된 카운터가 필요하지 않습니다

c = Counter({'the': 10, 'to': 10, 'of': 5, 'independence': 5, 'puigdemont': 5, 'mr': 5, 'a': 4, 'spain': 4, 'for': 4}) 

for i, k in enumerate(c.most_common()): 
    c[k[0]] = i 

결과 :

Counter({'spain': 8, 'for': 7, 'a': 6, 'puigdemont': 5, 'independence': 4, 'mr': 3, 'of': 2, 'the': 1, 'to': 0}) 

업데이트 :

결과 :

{'a': 6, 'spain': 8, 'of': 4, 'mr': 3, 'the': 0, 'for': 7, 'to': 1, 'independence': 2, 'puigdemont': 5} 
+0

저에게 대답 해 주셔서 감사합니다. 그러나, 그것은 나를 위해 작동하지 않습니다 ... 자세한 내용은 내 질문을 업데이트했습니다. – nimsbnims

+0

@nimsbnims 업데이트 – Alexey

+0

대단히 감사합니다! 이제 작동합니다. – nimsbnims