将两个字典合并为一个列表

3

我有两个字典,我想将这两个字典以keys-->values,keys-->values的格式组合成一个列表... 去掉任何None或['']

目前我可以将字典组合在一起,但无法创建一个组合后的列表... 我有期望的输出 .. 任何输入都会受到赞赏

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']
3个回答

5
这应该就可以了:
[i for k, v in (dict1.items() + dict2.items()) for i in [k] + (v or []) if i]

遍历两个字典的组合项,然后遍历键和值列表,返回第二次遍历中存在的每个项目。在您的示例字典中返回['313115','313113','311957','253036','12345','305403'] - 顺序不同,因为Python 字典迭代是无序的。如果字典很大,使用dict.items()可能会很耗费资源,因为它需要 O(n) 的大小,而不是迭代。如果使用itertools,在效率上更高(并将要处理的字典放在一个地方):
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]

感谢Martijn Pieters提供的from_iterable技巧。


@kevinn - 上面的代码没有输出任何东西,打印在哪里发生了呢? - carte blanche
它不会打印任何东西。你必须自己处理结果(比如打印它)。 - kevingessner
Python的set不允许重复,所以只需执行set(your_list)。或者,使用集合推导式代替列表推导式立即丢弃重复元素。 - kevingessner

1
以下代码能够以尽可能高效的方式给出所需结果,尽管有些冗长:
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']

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, []]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接