2017-01-18 4 views
2

나는 목록이 Python이고 사전에 사전이 포함되어 있습니다.파이썬으로 사전의 사전에서 값을 쿼리하는 방법은 무엇입니까?

{'METTS MARK': {'salary': 365788, 'po': 1}, 'HARRY POTTER':{'salary': 3233233, 'po': 0} 

'po' = 1으로 레코드 수를 어떻게 계산합니까?

나는이 시도 :

sum = 0 
for key, values in DIC: 
    if values[po] == 1: 
     sum = sum + 1 

을하지만 반환 사전에 too many values to unpack

감사를

+0

'DIC.items()'를 사용하여'key'와'value'를 얻습니다. –

답변

6

당신은 단순히 조건을 통해 sum과 합계를 사용할 수 있습니다

total = sum(values.get('po') == 1 for values in DIC.values()) 

하는 (@VPfB가 말한 것과 같습니다) :

total = sum (1 for item in DIC.values() if item.get('po') == 1) 

그러나 후자는 약간 덜 효율적입니다.

은 문자열이기 때문에 당신은 또한 'po' 대신 po 사용해야하고,이 'po'모든 사전의 일부가 아닌 경우가 작동한다는 보장하기 때문에 당신은 더 나은 .get('po')를 사용합니다.

생각해 보면 for 루프.items()을 사용하는 것을 잊어 버렸습니다. 사전을 반복하면서 키 위로 을 반복하면이 경우 키를 두 요소가있는 튜플에 풀 수 없습니다.

그럼에도 불구하고 발전기를 사용하면 메모리 효율이 향상되고 (코드가 빨라짐) 깨끗한 코드가됩니다. 또한 .items 대신 .values을 직접 반복함으로써 패킹 및 패킹을 저장하므로 성능이 향상 될 것으로 예상됩니다.

+0

@MYGz : 고맙습니다.'.get'을 사용하도록 업데이트했습니다. –

+0

.get ('po', 0)을 사용해야합니다. 귀하의 버전에서는 없음으로 인해 예외가 있습니다. 그리고 sum()은 목록을 사용하고 생성자를 사용하면 더 빠르게 작동합니다. 따라서 DIC.values ​​()의 값에 대해 [values.get ('po', 0) == 1]을 사용하는 것이 더 낫습니다. –

+0

@OleksandrDashkov : 키가 없으면 'None'이 반환됩니다. 'None == 1'은'False'를 생성합니다 (따라서 0으로 계산됩니다). 'values ​​[ 'po']'가'2 '일 가능성이 있습니다.이 두 번 계산하지 않으려는 경우, 이것을 제거하고 싶을 수 있습니다. –

2

당신은 이런 식으로 그것을 얻을 수 있습니다

a = { 
    'METTS MARK': {'salary': 365788, 'po': 1}, 
    'HARRY POTTER': {'salary': 3233233, 'po': 0} 
    } 

print(len([b for b in a.values() if b.get('po')==1])) 

출력 : 여기에

1 

우리가 사전 키 po==1의 목록을 만들 수 있습니다. 그리고 목록의 길이를 계산합니다.

관련 문제