2013-12-10 4 views
4

도와 주실 수 있는지 궁금합니다.방법 : 목록 내의 사전 비교

나는 사전을 포함하는 두 개의 목록을 가지고 있는데, 대부분이 키는 동일합니다.

x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...] 
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...] 

지금 내가 키 즉 키 a를 기준으로 값을 비교하고 싶은, 그러나 두 목록의 길이는 항상 동일하지 않을 것입니다 : 간단한 예를 들어 아래를 참조하십시오. 해당 사전 (즉, x1[0]['a'] == x2[1]['a'])이 있으면 키 a는 항상 두 사전에 있습니다.

키 사전을 비교하여 어떻게 x1에있는 x2에 나타나지 않는 단어를 먼저 삭제할 수 있습니까? 그런 다음 특정 값이 두 사전에 표시되는지 확인한 다음 데이터베이스에 기록하십시오. 여기서는 필요하지 않습니다.

내가 생각했던 것은 이러한 사전을 키 a를 기반으로 한 목록 내의 튜플에 결합하는 것이 었습니다. 그런 다음이를 반복하고이 값을 비교하십시오. 이것은 아마도 최선의 방법이 아닙니다. 더 좋은 아이디어가 있다면 언제든지 알려주십시오. :)

[편집.]

나는 명확하게 표현 질문을하지 않았다, 미안 해요. 내가 바라는 바는; 첫 번째 : 키에 기반한 사전 검색 a. 두 번째 : 일치하지 않는 키는 무시합니다 (키 a). 셋째 : 비교 키 b. 넷째 : b의 비교를 기반으로 데이터베이스를 업데이트합니다.

답변 해 주신 모든 분들께 감사드립니다.

내 대답은 다음과 같이 될 것이다 : "나는 목록 빌려 x2에서 사전에 해당 x1에서 사전을 포함하는 튜플을 구축 잘 할 거라고 생각

다음 키 B를 비교하는 각각의 튜플을 반복 그러나 나는 그것이 너무 느릴 수도 있다고 생각했다. "

나는 그것을하는 아주 좋은 방법이라고 생각하지 않습니다. 그래서 내가 여기에있어 :)

감사합니다.

+2

원하는 결과를 설명해주십시오. 모든 쌍을 비교하는 것은 쉽지만 모든 비교의 결과는 무엇을해야합니까? – Alfe

+1

그리고리스트가 똑같이 길지 않으면 어떻게 될까요? – Alfe

+1

성명서를 설명해 주시겠습니까? '해당 사전이 있다면 핵심은 항상 두 사전에있게됩니다. ' 당신의 본보기는별로 도움이되지 않습니다. – Abhijit

답변

1

내가 원하는 바를 정확히 이해하려면이 두 가지 목록을 'a'값을 키로하여 사전으로 바꾸어서 작동하는 다음과 같이하십시오. 각 목록 내에 'a'값의 복제가 없다고 가정하고 'a'값을 키로하고 짝을 지은 'b'의 튜플을 값으로 사용하여 사전을 반환합니다.

x1 = [{'a':1,'b':"cat"}, {'a':2,'b':"parrot"}, {'a': 3, 'b': 'dog'}] 
x2 = [{'a':2,'b':"dog"}, {'a':1,'b':"fish"}] 
x1_d = {d['a']: d['b'] for d in x1} 
x2_d = {d['a']: d['b'] for d in x2} 
matched_keys = set(x1_d) & set(x2_d) 
result = {key: (x1_d[key], x2_d[key]) for key in matched_keys} 
print result  # {1: ('cat', 'fish'), 2: ('parrot', 'dog')} 

이 작업을 수행하는 더 빠른 방법이있을 수 있지만 찾고있는 결과 종류인지 확인할 수 있습니다.

1

당신은 당신이 비교 결과의 목록을 얻을 것이다

[ a['a'] == b['a'] for a, b in zip(x1, x2) ] 

를 호출하는 경우. 목록이 똑같이 길지 않은 경우, 짧을수록 비교되는 쌍의 수를 결정합니다.

결과가 부울 값 목록 (True, False)이됩니다. 다른 것을 원한다면 더 명확히 기술하십시오. 이 코드는 작동

2

난 정말 당신의 비교를 얻을하지 않습니다,하지만 난 당신이 원하는 것은 동등하게 (그러나 덜 효율적인),

len(x1)==len(x2) and all(a['a']==b['a'] for (a, b) in zip(x1, x2)) 

또는 추측

[a['a'] for a in x1] == [b['a'] for b in x2] 
+0

모든'dict'이 키'a'를 포함하는 것은 아니지만, 만약 그들 중 하나가 ... 그렇다면 두 번째 것에 잠재적 인 예외가 있다는 것을 의미합니다. –

+0

@JonClements 알겠습니다. 대신에 [a.get ('a') in a x1] == [b.get ('a') for b2 for'x2]'를 사용할 수 있습니다. 'dict'에 키'a'가 포함되어 있지 않으면 두리스트 모두에 두 개의'None'이 생깁니다. – chys

1
x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"}] 
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},{'a':3},{'a':2}] 

[(_x2,_x2['a'] in [_x1['a'] for _x1 in x1]) for _x2 in x2] 
[({'a': 2, 'b': 'dog'}, True), 
({'a': 1, 'b': 'fish'}, True), 
({'a': 3}, False), 
({'a': 2}, True)] 

한 방향으로. 양방향으로 적용하거나 두 번만 사용할 수 있습니다.