2014-09-03 7 views
1

다음과 같은 코드를 목록 이해력에 다시 쓰는 방법이 있는지 궁금합니다. 난 당신이 시도 할 수있는 것보다 올바르게 이해하면 감사루프를 이해하기 위해 루프를 다시 작성하는 방법

inputDict는 딕셔너리

result = {} 
for key in inputDict: 
    total = 0 
    for nodes in inputDict : 
     total = total + (key in inputDict[nodes]) 
    result.update({key : total}) 
+3

코드 자체가 작동하지 않는다고해서 코드를 업데이트 할 수 있습니까? –

+2

_list 이해 _? 목록이 아닌 사전을 작성 중입니다. –

+0

코드의 어떤 부분이 작동하지 않습니까? –

답변

1

입니다 :

result = [(key, sum(key in inputDict[nodes] for nodes in digraph)) for key in inputDict] 

또는 :

result = dict((key, sum(key in inputDict[nodes] for nodes in digraph)) for key in inputDict) 

을 아니면 목록을 필요로하는 경우 :

result = [(key, sum(key in vals for nodes in digraph)) for key, vals in inputDict] 
+0

멋진 작품. 이런 식으로 생각하는 것은 어렵습니다. 파이썬 목록 이해력을 배우는 방법에 대한 제안이 있습니까? 고맙습니다. – galaxyan

+1

당신은 @ galaxyan에 오신 것을 환영합니다. 시간 문제 일뿐입니다. 당신이 생각할 수있는 것만 큼 어렵지는 않습니다. comprh는 'for loop'를 곧 작성하고 솔직하게 유일한 길은 아니라는 것을 열거하십시오. –

+2

항상 최선의 방법은 아닙니다. 코드 명확성은 매우 중요하다는 것을 기억하십시오. 코드는 한 번 쓰지만 수백 번 읽습니다.이해가 어려워지면 전통적인 'for'블록으로 만들 때 아무런 문제가 없습니다. – IanAuld

1

목록을 작성하지 않으므로 목록 이해가되지 않습니다.

import collections 
import itertools 
result = collections.Counter(itertools.chain.from_iterable(inputDict.values())) 
그러나, 각 노드에 노드 링크 얼마나 많은 계산 것으로 보인다 수행하려는 작업은 쉽게 각 노드는 inputDict의 값을 표시하는 횟수를 계산하는 collections.Counter를 사용하여 수행 할 수 있습니다

itertools.chaininputDict.values()이고 문자열은 노드의 모든 목록을 하나의 큰 반복자로 묶습니다. (또는 그것들은 노드들의 집합입니다.) 말하기 어렵습니다. collections.Counter은 각 요소를 몇 번이나 셉니다. 결과는 collections.Counter 인스턴스이며 대부분 dict처럼 작동합니다. 이 몇 가지 차이점하지만, 그래서 정확히 dict 유형의 결과를 필요로하는 경우, 당신은에 dict를 호출 할 수 Counter하지 카운터에있는 항목 0의 수를 반환

result = dict(result) 

하는 것으로하지만, dict하지 않습니다. dict을 호출하면 inputDict.values()에 나타나지 않은 노드에 0을 입력해야 할 수 있습니다.


Counterchain의 사용은 그래서 여기에 당신이 라이브러리 코드를 가져 오지 않고 그를 써서 방법, 여기에 무슨 일이 일어나고 있는지의 일부를 숨길 수 있습니다 :

result = {} 

# Initialize counts to 0, to make sure nodes that don't appear in the values have the 
# right count and to make sure we don't need to check `if node in result` later. 
for node in inputDict: 
    result[node] = 0 

# Go through and count node occurrences. 
for adjacent_nodes in inputDict.values(): 
    for node in adjacent_nodes: 
     result[node] += 1 

하는 쉬운 방법이 없습니다를 이것을 collections.Counter이 존재하는 이유 중 하나 인 알고리즘 적 복잡성 희생없이 이해하기 시작하십시오.

관련 문제