我有一本看起来像
的字典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]]
答案 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')