以下代码能够以尽可能高效的方式给出所需结果,尽管有些冗长:
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()))))))
你可以把它分解成以下几个部分:
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))))
如果使用一个
None
过滤器的
ifilter
将会从可迭代对象中移除诸如
None
和
''
这样的假值。对于您特定的输入,外部过滤器是不需要的,但如果作为键使用,则也会移除
''
和
None
。重复的值会被移除。
Python字典中的排序是任意的,因此排序与您的示例不匹配,但所有预期的值都在那里。
演示:
>>> 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']
set(your_list)
。或者,使用集合推导式代替列表推导式立即丢弃重复元素。 - kevingessner