2014-12-12 2 views
0

입력 유효성 검사를 수행하면서 제공된 데이터에 지정된 모든 필수 속성이 있는지 여부와 원하지 않는 속성을 버리는 지 여부를 구체적으로 확인하면서 다음과 같이했습니다.일부 쌍을 새 사전에 복사하는 파이썬 사전 이해

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> print input 
{'v1': 'val1', 'a3': 'val3', 'a2': 'val2'} 
>>> goodkeys = ['a2', 'a3'] 
>>> print goodkeys 
['a2', 'a3'] 
>>> output = {} 
>>> for a in goodkeys:  
... output[a] = input[a] 
... 
>>> 
>>> print output 
{'a3': 'val3', 'a2': 'val2'} 

물론 작동합니다. 그러나 더 평범한 방법으로 이것을 할 수도 있다는 생각이 들었습니다. 나는 시도했다 :

>>> output = {} 
>>> print output 
{} 
>>> output = { a:v for a in goodkeys for v in input[a] } 
>>> print output 
{'a3': '3', 'a2': '2'} 
>>> 

나는 어느정도 효과가 있다고 생각했는데, 그 다음 값이 잘못되었다는 것을 깨달았다. 예쁜 파이썬 방법이 있습니까? 그리고 무슨 일이 있었는지, 파이썬은 어디에서 그 가치를 얻었습니까?

+0

input'가 좋은 키 중 하나를 포함하지 않는 '경우는,'a2' 말을 변경해보십시오? – georg

+0

변수 이름으로 'input'을 사용하지 마십시오. 이것은 python 3의 키워드입니다. – palsch

답변

0
output = { a:input[a] for a in goodkeys } 

두 번째 for은 문자열 값의 문자를 반복합니다.

3

당신은 dictionary view objects 사용할 수 있습니다

goodkeys = {'a2', 'a3'} 
output = {a: input[a] for a in input.viewkeys() & goodkeys} 

goodkeys가 세트입니다; dict.viewkeys()은 사전의 내용을 반영하는 집합과 같은 객체를 생성하고 & goodkeys은 해당 키와 goodkeys 집합 사이의 교차를 생성합니다. 그렇게하면 입력 딕셔너리와 올바른 키 세트에있는 키만 생성됩니다.

는이 같은 중첩 루프를 생성 :

for a in goodkeys: 
    for v in input[a]: 
     # v is a single character in the string value 

데모 :

>>> for a in goodkeys: 
...  for v in input[a]: 
...   print a, v 
... 
a3 v 
a3 a 
a3 l 
a3 3 
a2 v 
a2 a 
a2 l 
a2 2 
: input[a] 이후

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> goodkeys = {'a2', 'a3'} 
>>> {a: input[a] for a in input.viewkeys() & goodkeys} 
{'a3': 'val3', 'a2': 'val2'} 

이 내부 루프는 각 값의 개별 문자를 생산, 문자열입니다

키는 고유해야합니다. 따라서 a2의 경우 v, a, l2은 다른 것들과 함께 버려집니다. 사전 이해는 'a2': 'v'을 먼저 설정 한 다음 'a2': 'a' 등을 설정하고 결국에는 'a2': '2' 만 출력에 남습니다.

그 내부 루프를 사용할 필요가 없습니다. 당신이 KeyError를 얻을 것 input에없는 goodkeys의 모든 키가있는 경우를 제외

{a: input[v] for a in goodkeys} 

: 당신이 함께 붙어 있었다. 사전보기 접근법은 그 문제를 깔끔하게 회피합니다.

+0

'KeyError'는 단순히'dict.viewkeys()'를 사용하지 않고 교차를 찾는 대신에'{a : input [a] in a goodkey in a input} '을 사용함으로써 피할 수 있습니다. 하나의 이점은'viewkeys()'가 도입되었을 때 2.7 이전의 Python 버전에서 작동한다는 것입니다. – martineau

+0

@martineau : 확실히, OP는 2.7을 사용한다고 말했고, 교차 연산은 C에서 한번만 이루어졌고, 따라서 각 반복마다 멤버쉽 테스트 연산보다 빠릅니다. –

+0

예,하지만 질문에서 버전 2.7을 사용하고 있다는 사실을 편집 했으므로 더 일반적입니다. – martineau

0

이상 생각할 수 있습니다. 당신이 일이하고 싶어 - 그냥

output = { a:v for a in goodkeys for v in input[a] } 

단순히 ...

output = { a:input[a] for a in goodkeys }