2013-04-30 2 views
3

두 개의 사전이 있습니다.이 두 int를 형식 키 -> 값, 키 -> 값 목록으로 결합하고 싶습니다. 아무 것도 제거하지 않거나 [ '']목록에 두 개의 dicts 합치기

현재 나는 내가 dicts을 결합하지만 결합 된 목록을 만들 수없는 경우 아래 가지고 ... 나는 expecte 출력이 .. 어떤 입력이

dict1={'313115': ['313113'], '311957': None} 
dict2={'253036': [''], '305403': [], '12345': ['']} 

dict = dict(dict1.items() + dict2.items()) 
print dict 

{'313115': ['313113'], '311957': None, '253036': [''], '12345': [''], '305403': []} 

EXPECTED OUTPUT: 
['313115','313113','311957','253036','305403','12345'] 

답변

5

이 그것을 수행해야합니다

[i for k, v in (dict1.items() + dict2.items()) for i in [k] + (v or []) if i] 

다음 두 번째의 각 항목을 반환 키를 더한 값의 목록을 걸어 두 dicts의 결합 된 항목을 걸어 걸어 가야한다.

예를 들어 dicts에 ['313115', '313113', '311957', '253036', '12345', '305403']을 반환합니다. 파이썬의 dict 반복이 순서가 없기 때문에 순서가 다릅니다.

EDIT :

dict.items() 큰 dicts에 비쌀 수 - 오히려 반복보다는 O (N) 크기 걸린다. 당신이 itertools를 사용하는 경우,이 더 효율적입니다 (한 곳에서 작업중인 dicts 유지) 다음 from_iterable 팁을위한 마티 피에 터스에

import itertools 
[i 
for k, v in itertools.chain.from_iterable(d.iteritems() for d in (dict1, dict2)) 
for i in [k] + (v or []) 
if i] 

감사합니다.

+0

@kevinn - 이상 아무것도 인쇄하지 않습니다. 인쇄는 어디에서 발생합니까? – user2125827

+0

아무 것도 인쇄하지 않습니다. 그 결과를 직접 인쇄해야 할 것입니다. – kevingessner

+0

목록에서 중복 된 항목을 지우는 방법은 무엇입니까? – user2125827

1

appreeciated 다음 줄을 당신이로 원하는 무엇을 제공해야 가능한 조금이라도 효율적인 방법을 사용하십시오.

from itertools import chain, ifilter 

list(ifilter(None, dict1.viewkeys() | dict2.viewkeys() | set(chain(chain.from_iterable(ifilter(None, dict1.itervalues())), chain.from_iterable(ifilter(None, dict2.itervalues())))))) 
같은 None하고 반복 가능한에서 '' 거짓-y 값을 제거하는 None 필터

values1 = chain.from_iterable(ifilter(None, dict1.itervalues())) 
values2 = chain.from_iterable(ifilter(None, dict2.itervalues())) 
output = list(ifilter(None, dict1.viewkeys() | dict2.viewkeys() | set(chain(values1, values2)))) 

ifilter :

당신은 그것을 파괴 할 수있다. 특정 입력에 외부 필터가 필요하지 않지만 키로 사용되는 경우 ''None을 제거 할 수 있습니다. 중복 값이 ​​제거됩니다.

파이썬 사전의 순서 지정은 임의적이므로 순서는 샘플과 일치하지 않지만 모든 예상 값이 있습니다.

데모 :

>>> list(ifilter(None, dict1.viewkeys() | dict2.viewkeys() | set(chain(chain.from_iterable(ifilter(None, dict1.itervalues())), chain.from_iterable(ifilter(None, dict2.itervalues())))))) 
['313115', '305403', '313113', '311957', '253036', '12345'] 
0
[each 
if isinstance(each, str) else each[0] 
for pair in dict(dict1, **dict2).iteritems() 
for each in pair 
if each not in [[''], None, []]]