#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())}