我有两个词典,我想将这两个词组合在格式键的列表中 - >值,键 - >值...删除任何无或['']
目前我有以下我可以结合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']
答案 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, []]]