python dictionary将键的值放入一个列表,其中键位于另一个列表中

dai*_*yue 2 python dictionary python-3.x

我有一本看起来像的字典

a = {32: [2230], 37265: [2218], 51: [2223], 164: [2227], 3944: [2224]}
Run Code Online (Sandbox Code Playgroud)

但是,值a可能包含多个元素,例如

a = {32: [2200, 2230], 37265: [2201, 2218], 51: [2223], 164: [2227], 3944: [2224]}
Run Code Online (Sandbox Code Playgroud)

我有一个列表,将键存储a在组中,

b = [[32, 51, 164], [3944, 37265]]
Run Code Online (Sandbox Code Playgroud)

现在我想获取另一个列表中每个组中键的值,

        clusters = []
        for key_group in b:
            group = []

            for key in key_group:
                group.extend(a[key])

            if len(group) > 1:
                clusters.append(group) 
Run Code Online (Sandbox Code Playgroud)

所以最终的清单看起来像,

clusters = [[2230, 2223, 2227], [2224, 2218]]
Run Code Online (Sandbox Code Playgroud)

如果a在值列表中包含多个元素,clusters看起来像,

clusters = [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]
Run Code Online (Sandbox Code Playgroud)

我想知道最好的方法是什么.

同样,如果b包含只有一个值/键的列表,并且该键映射到单个元素列表a,则该列表将被忽略,

a = {32: [2200, 2230], 37265: [2201, 2218], 51: [2223], 164: [2227], 3944: [2224]}

b = [[32, 51, 164], [3944], [37265]]
Run Code Online (Sandbox Code Playgroud)

3944映射到[2224],将被忽略,但37265映射到[2201, 2218],将保留,因为len([2201, 2218]) > 1.clusters在这种情况下将如下所示,

clusters = [[2200, 2230, 2223, 2227], [2201, 2218]]         
Run Code Online (Sandbox Code Playgroud)

Chr*_*nds 5

假设您的值a始终只是一个包含单个元素的列表,那么它是一个简单的嵌套列表解析:

[[a[k][0] for k in sublist] for sublist in b]
# [[2230, 2223, 2227], [2224, 2218]]
Run Code Online (Sandbox Code Playgroud)

由于您现在已经阐明了a可以包含多个元素的列表的值,您可以使用它itertools.chain.from_iterable来展平返回的列表并提供所需的输出:

from itertools import chain
[list(chain.from_iterable(a[k] for k in sublist)) for sublist in b]
# [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]
Run Code Online (Sandbox Code Playgroud)