Добавление дополнительного значения ключа в существующий список словарей - PullRequest
0 голосов
/ 09 июля 2019

У меня есть список словаря, к которому я хочу добавить 3 дополнительные пары значений ключа.

Список словаря

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69]},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39]}
]

Вещи, которые необходимо добавить

{'max': 70, 'min': 30, 'std_dev': 15.01},
{'max': 70, 'min': 30, 'std_dev': 15.01}`

, чтобы это выглядело примерно так:

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69], 'max': 70, 'min': 30, 'std_dev': 15.016218454280247},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39], 'max': 70, 'min': 30, 'std_dev': 15.01}
]

Поскольку я храню max, min и std_dev в их соответствующих списках, я попытался сделать следующее:

past_data = {
    'max': 0,
    'min': 0,
    'std_dev': 0
}

for x in range(0, len(max_list)):
    past_data['max'] = max_list[x]
    past_data['min'] = min_list[x]
    past_data['std_dev'] = std_dev_list[x]
    output_data.append(past_data)

Но я получаю следующий вывод:

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69]},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39]},{'max': 70, 'min': 30, 'std_dev': 15.01}, {'max': 70, 'min': 30, 'std_dev': 15.01}
]

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Здесь я вижу два вопроса:

1) Как вы синхронизируете два списка синхронно?

2) При двух словарях как вы объединяете один в другой?

Для первого, zip обычно лучше всего:

for (d1, d2) in zip(list_of_dictionary, max_list):

Если вы хотите использовать явный индекс списка, он будет выглядеть так:

for i in range(0, math.min(len(list_of_dictionary), len(max_list)):
    d1 = list_of_dictionary[i]
    d2 = max_list[i]

Дляво-вторых, используйте update, чтобы скопировать все пары ключ / значение из одного вхождения в другой.Это изменяет обновленный словарь, поэтому нет необходимости создавать новый список.

    d1.update(d2)

Если вы хотите избежать редактирования исходного словаря, это немного сложнее.Одним из способов является что-то вроде:

    copied_data = {}
    copied_data.update(d1)
    # or just copied_data = d1.copy()
    copied_data.update(d2)
    output_data.append(copied_data)

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

Этоделает поверхностную копию, что, вероятно, хорошо, но может иметь странные последствия с вашими значениями by_l - он скопирует ссылку на тот же объект списка в новый dict, поэтому изменение этого значения также приведет к изменению оригинала.Это, вероятно, выходит за рамки этого обсуждения.

0 голосов
/ 09 июля 2019

Вы можете сделать это в одну строку

output_data = [{**a, **b} for a, b in zip(list_of_dictionary, max_list)]

, это берет каждую пару словарей из вашего старого списка и нового списка и объединяет два словаря в один

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...