3

我有两个字典,我想将这两个 int 组合成一个列表,格式为 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']
4

3 回答 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']您的示例 dicts - 顺序不同,因为 python 的 dict 迭代是无序的。

编辑:

dict.items()在大型字典上可能会很昂贵——它需要 O(n) 大小,而不是迭代。如果您使用 itertools,这会更有效(并将您正在使用的 dicts 保存在一个地方):

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 提示。

于 2013-04-30T17:09:00.980 回答
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中删除 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']
于 2013-04-30T17:04:18.670 回答
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, []]]
于 2013-04-30T19:47:11.020 回答