Python 信息技术价值观的联合

Python 信息技术价值观的联合,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我正在寻找一种pythonic方法,在折叠组成值的列表后,获得OrderedDict的.values的并集。我希望结果是一个一维列表,按照自定义顺序排序 我的工作内容: from collections import OrderedDict order = list('acebd') d = OrderedDict([(1, ['a', 'e']), (2, ['a', 'b', 'c']) ]) 预期结果: ['a',

我正在寻找一种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']

但不确定如何映射到排序,并寻找更优雅或更快的解决方案。

注意:我的回答假设顺序无关紧要

您可以使用
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\u iterable

>>> set(chain.from_iterable(d.values()))
{'e', 'a', 'b', 'c'}
如果订单很重要,请使用
列表
OrderedDict.fromkeys

list(OrderedDict.fromkeys(chain(*d.values())))

注意:我的回答假设顺序无关紧要

您可以使用
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\u iterable

>>> set(chain.from_iterable(d.values()))
{'e', 'a', 'b', 'c'}
如果订单很重要,请使用
列表
OrderedDict.fromkeys

list(OrderedDict.fromkeys(chain(*d.values())))

你不需要扁平化,它们只是简单的列表,只是
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']

你不需要扁平化,它们只是简单的列表,只是
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']