Есть ли способ отобразить список элементов в словарь без цикла? - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу создать 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 голосов
/ 14 ноября 2018

Вы можете использовать Python генератор выражения для фильтрации данных и затем передать их обратно в 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)

И да, циклы в любой форме неизбежны для этой проблемы,По крайней мере, вы можете написать это в одну строку.

0 голосов
/ 14 ноября 2018

Циклы на некотором уровне здесь неизбежны, но вы можете скрыть их с помощью zip и operator.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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...