有没有办法将元素列表映射到字典而没有循环?

时间:2018-11-14 15:15:40

标签: python python-3.x list dictionary mapping

我想通过映射中央字典中的2个列表而不使用循环来创建2个字典。

输入字典:

edict_all = { 1:[[23,20]], 2:[[45,45]], 3:[[56,43]], 4:[[66,23]], 5:[[24,23]], 9:[[57,78]], 8:[[67,76]], 51:[[242,223]]}

我有2个列表:

list_a = [1,4,8,9,51]
list_b = [1,2,3,5,9]

当前,我正在使用2个循环:

edict_a, edict_b = dict(), dict()
for i in list_a:
    edict_a[i] = edict_all[i]

for i in list_b:
    edict_b[i] = edict_all[i]

输出为:

edict_a = {1: [[23, 20]], 4: [[66, 23]], 8: [[67, 76]], 9: [[57, 78]], 51: [[242, 223]]}

edict_b = {1: [[23, 20]], 2: [[45, 45]], 3: [[56, 43]], 5: [[24, 23]], 9: [[57, 78]]}

2 个答案:

答案 0 :(得分:1)

这里不可避免地要出现循环,但是您可以使用zipoperator.itemgetter隐藏它们:

from operator import itemgetter

edict_a = dict(zip(list_a, itemgetter(*list_a)(edict_all)))
edict_b = dict(zip(list_b, itemgetter(*list_b)(edict_all)))

答案 1 :(得分:0)

您可以使用Python generator expression过滤数据,然后将其传递回dict()构造函数:

edict_a = dict((key, value) for key, value in edict_all.items() if key in list_a)
edict_b = dict((key, value) for key, value in edict_all.items() if key in list_b)

是的,任何形式的循环都是不可避免的。至少您可以将其写成一行。