Сопоставление значений списка Python со значениями словаря

#python

#python

Вопрос:

У меня есть список строк…

rows = [2, 21]

И словарь данных…

data = {'x': [46, 35], 'y': [20, 30]}

Я хотел бы создать второй словарь, , с помощью строки, которая выглядит следующим образом. dataRows ..

dataRows = {2: {'x': 46, 'y': 20}, 21: {'x': 35, 'y': 30}}

Я попробовал следующий код, но значения dataRows всегда одинаковы (последнее значение в цикле):

 for i, row in enumerate(rows):
    for key, value in data.items():
        dataRows[row] = value[i]
  

Будем признательны за любую помощь.

Комментарии:

1. Какая связь между data и rows ? Потому что, если вы переходите к их соединению по порядку вставки, у вас возникнут проблемы, потому что словарь упорядочивает элементы по хэш-значению.

2. Позиция строки соответствует позиции значения в словаре данных. Итак, другими словами, если строка = 2 (позиция = 0), ее соответствующими значениями будут x = 46 (позиция 0) в data[‘x’] и y = 20 (позиция 0) в data[‘y’] .

Ответ №1:

Ваша проблема в том, что вы не помещаете вложенные словари внутри потоков данных. Исправление будет следующим:

 for i, row in enumerate(rows):
    dataRows[row] = {}
    for key, value in data.items():
        dataRows[row][key] = value[i]
  

Комментарии:

1. ТОЧНО такой же код (включая пробелы) Я вставил свой ответ (не опубликован, потому что вы опубликовали первым).

2. @AndroidNoobie Кроме того, обратите внимание на использование collections.defaultdict(), что позволяет избежать назначения dict для каждой итерации (сообщение ниже)

Ответ №2:

Следующий код работает для меня:

 rows = [2, 21]

data = {'x': [46, 35], 'y': [20, 30]}

dataRows = {}

for i, row in enumerate(rows):
  dataRows[row] = {}
  dataRows[row]['x'] = data['x'][i]
  dataRows[row]['y'] = data['y'][i]

print dataRows
  

Обновить:

Вы также можете использовать collections.defaultdict(), чтобы избежать назначения dict потокам данных на каждой итерации.

 import collections

rows = [2, 21]

data = {'x': [46, 35], 'y': [20, 30]}

dataRows = collections.defaultdict(dict)

for i, row in enumerate(rows):
  for key, value in data.items():
    dataRows[row][key] = value[i]

print dataRows
  

Ответ №3:

В строке:

 >>> {r: {k: v[i] for k, v in data.items()} for i, r in enumerate(rows)}
{2: {'x': 46, 'y': 20}, 21: {'x': 35, 'y': 30}}
  

Ответ №4:

Вот решение Python 3 только с одним явным циклом:

 {r: dict(zip(data.keys(), d)) for r, *d in zip(rows, *data.values())}