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

时间:2017-11-09 15:28:59

标签: python python-3.x dictionary

我有一本看起来像

的字典
a = {32: [2230], 37265: [2218], 51: [2223], 164: [2227], 3944: [2224]}

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

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

我有一个列表,用于将密钥存储在a组中,

b = [[32, 51, 164], [3944, 37265]]

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

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

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

            if len(group) > 1:
                clusters.append(group) 

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

clusters = [[2230, 2223, 2227], [2224, 2218]]

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

clusters = [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]

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

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

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

b = [[32, 51, 164], [3944], [37265]]

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

clusters = [[2200, 2230, 2223, 2227], [2201, 2218]]         

4 个答案:

答案 0 :(得分:5)

假设a中的值始终只是一个包含单个元素的列表,那么它就是一个简单的嵌套list comprehension

[[a[k][0] for k in sublist] for sublist in b]
# [[2230, 2223, 2227], [2224, 2218]]

由于您现在明确了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]]

答案 1 :(得分:4)

您可以使用list comp执行相同的工作:

clusters = [[a[key][0] for key in k] for k in b]

res => [[2230, 2223, 2227], [2224, 2218]]

如果a可以有多个元素,你也可以这样做:

clusters = [[it for key in k for it in a[key]] for k in b]

res => [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]

答案 2 :(得分:2)

我建议使用三重列表理解:

list(filter(lambda l:len(l) > 1, ([elem for key in lst for elem in a[key]] for lst in b)))

这适用于任意长度的列表值。 filter删除包含一个或零个元素的列表。

答案 3 :(得分:2)

根据你的编辑:

    file_to_plot = file_to_plot.set_index(['user'])
    fig, ax = plt.subplots()
    fontP = FontProperties()
    fontP.set_size('small')
    file_to_plot[[" mean_accuracy_all_classes_normal", " delta_all_classes"]].plot(ax=ax, kind='bar', color= ['g', 'r'], width = 0.65, align="center", stacked=True)
    file_to_plot[[" mean_accuracy_user_classes_normal", " delta_user_classes"]].plot(ax=ax, kind='bar', color=['y', 'b'], width=0.65, align="center", stacked = True)
    lgd = ax.legend(['Tutte le classi (normale)', 'Tutte le classi (incrementale)', 'Classi utente (normale)', 'Classi utente (incrementale)'], prop=fontP, loc=9, bbox_to_anchor=(0.5, -0.15), ncol=4,borderaxespad=0.)
    ax.set_ylabel('% Accuratezza')
    ax.set_xlabel('Utenti')