我正在寻找一种pythonic方法来获取OrderedDict .values
的联合,在折叠组成值的列表之后。我希望结果是一维列表,根据自定义订单排序。
我正在与之合作:
from collections import OrderedDict
order = list('acebd')
d = OrderedDict([(1, ['a', 'e']),
(2, ['a', 'b', 'c'])
])
期望的结果:
['a', 'c', 'e', 'b'] # ordered according to `order`, where len(order)
# may be greater than len(result) here
我目前的实施
def flatten(iterable):
"""Flatten a nested iterable. Not my code."""
it = iter(iterable)
for e in it:
if isinstance(e, (list, tuple)):
for f in flatten(e):
yield f
else:
yield e
print(list(set(flatten(d.values()))))
['a', 'e', 'b', 'c']
但不确定如何映射到排序,并寻找更优雅或更快的解决方案。
答案 0 :(得分:4)
你不需要压扁,它们只是简单的列表,只是itertools.chain
它们在一起
您可以在列表推导中将该集用作保护,以获得所需的顺序:
In []:
import itertools as it
s = set(it.chain.from_iterable(d.values()))
[o for o in order if o in s]
Out[]:
['a', 'c', 'e', 'b']
答案 1 :(得分:1)
注意:我的回答是假定订单无关紧要。
您可以使用itertools.chain
和set
:
>>> from collections import OrderedDict
>>> from itertools import chain
>>>
>>> d = OrderedDict([(1, ['a', 'e']),
(2, ['a', 'b', 'c'])
])
>>> set(chain(*d.values()))
{'e', 'a', 'b', 'c'}
或者,您可以使用itertools.chain.from_iterable
:
>>> set(chain.from_iterable(d.values()))
{'e', 'a', 'b', 'c'}
如果订单很重要,请使用list
和OrderedDict.fromkeys
:
list(OrderedDict.fromkeys(chain(*d.values())))