2017-05-03 5 views
-3

문자열 'Hello World'가 있다고 가정하고 사전을 사용하여 요소와 해당 빈도의 매핑을 얻으려는 경우이 다음 코드로 충분하지만 사용하려면 목록 이해력, 어떻게 'if', 'else'를 사용할 수 있습니까? 솔루션주십시오if-else를 간결한 목록 이해력으로 변환

for i in s: 
    if i in d: 
     d[i]=d[i]+1 
    else: 
     d[i]=1 
+0

더욱 간결하게 :'collections.Counter' 또는'collections.defaultdict (int) '사용 –

+0

입력 요소에서 목록을 작성하지 않습니다. 당신은 ** 당신의 요소를 세고 있습니다 **. 'Counter()'를 사용하십시오. –

+0

목록 해석으로도 변환하는 방법을 찾고 있습니다. 해결책을 제공해주십시오. 나중에 대안을 볼 수 있습니다. –

답변

1

당신은 (사전 구축 지능형리스트를 사용하는 것이 이해가되지 않습니다) 사전 이해를 사용할 수 있습니다

s = 'Hello world' 
d = {char: s.count(char) for char in set(s)} 

set(s)은 고유의 집합입니다 문자를 키로 사용하고 이해 횟수 (str.count 사용)를 값으로 사용하여 사전을 만듭니다.

하지만 이해할 필요는 전혀 없습니다. 파이썬에는 "배터리 포함"이 있습니다. 이 경우 배터리가 collections.Counter입니다 :

import collections 
collections.Counter(s) 
경우

당신이 정말 지능형리스트 사용하려면 (내 개인적인 견해! 그렇지 및 안를) 당신이 작업에 필요한 예를 들면 부작용 : d[i] = 1 또는 d[i] = d[i] + 1가 할당되어 있으므로 지능형에서 금지 때문에

s = 'Hello world' 
d = {} 
[d.__setitem__(i, d[i]+1) if i in d else d.__setitem__(i, 1) for i in s] 
print(d) 

__setitem__ 호출이 필요하다. 그러나 __setitem__이 기능 대체품입니다.

+0

On point! 목록 이해력에서 if-else 처리에 대한 견해를 제공 할 수 있습니까? –

+0

@AshwinV "if"및 "else"로 목록 이해력 예제를 추가했습니다. 그것은 당신의 루프와 같지만 부작용을 기반으로합니다. 그것은 지적인 운동으로 재미 있지만 정상적으로 부작용 때문에 이해를해서는 안됩니다. – MSeifert

+1

물론 - 여기에있는 목록 comp는 너무 많은 레벨에서 잘못되었습니다 ... 그러지 마세요 :) –