2017-10-10 8 views
-1

사람이 다음 코드를 사용하여 저를 도와주세요 수 있습니다나는 목록 내에서 여러 사전을 가리키는 사전을 삽입 할 수있는 방법

는 인수가
[{k: {x: y for x, y in b.items()} for b in arg for k in range(len(arg))}] 

인 경우 :

arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}] 

임 찾고 출력 이다 : 나는 위의 DICT 이해를 실행하면

[0: {"key1": "val1", "key2": "val2"}, 1: {"key1": "val3", "key2": "val4"}] 

, 나는

,691를 얻을 수
[0: {"key1": "val3", "key2": "val4"}, 1: {"key1": "val3", "key2": "val4"}] 

1: 점이 0: 지점에서도 반복되는 이유는 무엇입니까? 어떻게 이런 일이 일어나지 않게하고 중첩 된 딕트를 독립적 인 값으로 가질 수 있습니까? 키는 중첩 된 dict에서 동일하지만 값은 달라야합니다.

+0

'k'와 'b'에 대해 이중 루프가 있습니다. 대신에 당신은 하나의 루프'k를 위해서, b는 enumerate (arg)'안에 하나의 루프가 필요합니다. –

+1

당신이 찾는 출력은 유효한 파이썬 객체가 아닙니다 ... 그리고 당신은'arg'에 오타가 있습니다 (쉼표는 세미콜론이어야합니다) –

+0

당신의 논리는 너무 복잡해서 이해하기 어렵습니다. 더 이상 읽을 수 없으며 "가독성이 중요합니다." -Zhe of Python –

답변

1

문제가 지나치게 복잡합니다.복사되지 않습니다 arg에서

>>> arg = [{"key1": "val1", "key2": "val2"}, {"key1": "val3", "key2": "val4"}] 
>>> dict(enumerate(arg)) 
{0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}} 

사전의 :

dict(enumerate(arg)) 

dict() 키 - 값 쌍의 반복자를 취 그냥 enumerate() function를 사용, 그것은 상자에서 당신의 키 - 값 쌍 을 생산 ; 그 문제가 있다면, 당신은 사용할 수있는 map()dict.copy 이상 :

dict(enumerate(map(dict.copy, arg))) 

또는 단일 사전 이해를 사용

귀하의 코드는 이중 루프를 생성
{i: a.copy() for i, a in enumerate(arg)} 

; 당신은 기본적으로이 일을하고 있습니다 :

_dictionary = {} 
for b in arg: 
    for k in range(len(arg)): 
     _dictionary[k] = {x: y for x, y in b.items()} 
result = [_dictionary] 

그렇게 arg의 모든 사전 당신이 또 다른 루프를 생성하고 반복 b의 사전을 만들 수 있습니다. k에 대한 마지막 사전은 이길 것이며, arg의 마지막 사전은 01에 할당되어 arg에있는 다른 사전을 대체합니다 (이전의 모든 정수 키에도 할당 됨).

{x: y for x, y in b.items()}을 사용할 필요가 없습니다. b.copy()만으로 충분할 것입니다. 왜 최종 결과를리스트에 넣어야하는지 잘 모르겠습니다.

+0

을 잘 설명해 주셔서 감사합니다. 열거 함수에 대해서는 생각하지 않았습니다. 다시 한 번 감사드립니다! – KabirGandhiok

0

출력에 약간의 문제가 있습니다.

[0 : 당신은 임 찾고 당신의

출력은 Dictionary 놓습니다 { "키 1": "VAL1", "키 2": "을 val2"}, 1 : { "키 1을" "val3", "키 2" "val4은"}]

list이다. 따라서, 유효 출력 같아야

{0 { 'KEY1' 'VAL1', '키 2': '을 val2'} 1 { 'KEY1' 'val3', '키 2': Martijn Pieters 쉬를 제공

IN : l = [{"key1":"val1", "key2":"val2"}, {"key1":"val3", "key2":"val4"}] 
OUT : {0: {'key1': 'val1', 'key2': 'val2'}, 1: {'key1': 'val3', 'key2': 'val4'}} 

편집 값 #driver

{ i:l[i] for i in range(len(l)) } 

# OR 

{ i:key for i,key in enumerate(l) } 

: 'val4는'}}

이것을 얻기 orter 메서드를 사용하여 enumerate. 그것도 확인하십시오.

0

올바르게 해석했다면 사전을 원한다. 그러면 다음이 수행됩니다.

{index: val.copy() for index, val in enumerate(arg)} 

여기에서 arg은 미리 정의 된 사전입니다.

EDIT : 위의 사용자 Martijn Pieters은이 작업을 수행하는 깔끔한 방법입니다!

0

코드가 복잡합니다. 어떻습니까? [{k: arg[k]} for k in range(len(arg))]