2017-09-16 5 views
-1

는이 코드가 두 줄에 기록 될 수 있다는을 setDefault 방법 또는 람다 사용하는 느낌이 있습니다이 코드를 두 줄로 쓸 수 있습니까?

variables = ['a','b','c','d'] 
for value in indefinite_dict.values(): 
    str1 = immediate_instantiation.get(value) 
    if str1 == None: 
     immediate_instantiation.update({value:variables[0]}) 
     del variables[0] 

그것은 indefinite_dict의 값을 통해 반복하고 그들을두고을 그 값은 이미하지 않은 경우 키를 입력하면 즉석의 인스턴스가 변수 목록의 첫 번째 멤버 값으로 해당 사전에 항목으로 추가되고 변수 목록의 첫 번째 멤버가 삭제됩니다. 당신은 해당 키가 이미 immediate_instantiation그 키가 같은 값을 가지고에있는 경우에도 삭제되지 variables에 값을 괜찮아 경우

+0

'변수 [0]'무엇입니까? –

+0

편지 목록입니다. – bobsmith76

+0

'variables '가 무엇인지에 대한 추가 된 내용과 포함시켜야하는 것이 더 나은 해결책을 만드는 데 도움이 될 수 있습니다. – Ryan

답변

1

, 당신은 당신 만 setdefault 함께 할 수있는 맞아 :

for value in indefinite_dict.values(): 
    if immediate_instantiation.setdefault(value, variables[0]) is variables[0]: 
     del variables[0] 

다른 맥락없이 두 줄에 내려하기는하지만, 다른 (그리고 종류의 불쾌한) 접근 방식을 취합니다

updates = (v for v in indefinite_dict.values() if v not in immediate_instantiation) 
immediate_instantiation.update({v: variables.pop(0) for v in updates}) 

그리고 indefinite_dictOrderedDict 인 것이 더 좋았습니다. 그렇지 않으면 잠재적으로 임의의 순서로 변수가 제거됩니다! (이 파이썬 3.6의 DICT 표현에 의존하지 마십시오.)

을이 variables 적어도 한 updates으로 보장되는이 아닌 돌연변이 솔루션은 후 variables이 필요하지 않은 경우 많은 청소기주의 :

updates = (v for v in indefinite_dict.values() if v not in immediate_instantiation) 
immediate_instantiation.update(zip(updates, variables)) 
+0

cool, 나는 그 해결책을 좋아한다 – bobsmith76

0

한 줄 솔루션 :

immediate_instantiation.update({value: variables.pop(0) for value in indefinite_dict.values() if value not in immediate_instantiation}) 
+0

당신과 같은 해결책을 게시하려면 여기로 왔어. 왜 네가 쓰러졌다는지 모르겠다. –

관련 문제