将两个dicts组合成一个列表

时间:2013-04-30 16:55:26

标签: python

我有两个词典,我想将这两个词组合在格式键的列表中 - >值,键 - >值...删除任何无或['']

目前我有以下我可以结合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']

3 个答案:

答案 0 :(得分: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'] - 顺序不同,因为python的dict迭代是无序的。

编辑:

dict.items()在大型dicts上可能很昂贵 - 它需要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提示。

答案 1 :(得分: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))))
带有ifilter过滤器的

None会从iterable中删除false-y值,例如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']

答案 2 :(得分: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, []]]