Python: как перебрать список словарей и добавить каждый словарь в качестве значения в новый словарь с уникальным ключом - без повторов - PullRequest
0 голосов
/ 11 июля 2019

Есть список диктов.Я хочу добавить ключ к каждому диктовку и добавить их все к одному диктовку.Как я могу сделать это, не получая повторения того же входа в новый диктат?

Я попробовал этот код:

# a_list is a list of dictionaries
# category_name is a string

def make_dict(a_list, category_name=None):

    a_dict = {}

    for item in a_list:
        for i in range(0, len(a_list)):
            a_dict.setdefault(category_name + str(i+1), item)

    return a_dict

Но пока он создает новое имя, первый объект в списке повторяется для общего числа объектов в списке.

{
    "Open Port 1": {
        "LocalAddress": "::",
        "LocalPort": 58448,
        "RemoteAddress": "::",
        "RemotePort": 0,
        "State": 100
    },
    "Open Port 2": {
        "LocalAddress": "::",
        "LocalPort": 58448,
        "RemoteAddress": "::",
        "RemotePort": 0,
        "State": 100
    },
    "Open Port 3": {
        "LocalAddress": "::",
        "LocalPort": 58448,
        "RemoteAddress": "::",
        "RemotePort": 0,
        "State": 100
    }, ... etc

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

С кодом, который вы разместили - вы получите тот же ключ "Open Port 1", переназначенный с каждым следующим диктом, потому что счетчик i не увеличивается:

i = 0
for item in a_list:
    a_dict.setdefault(category_name + str(i+1), item)
return a_dict

Исправленный путь будет следующим:

i = 0
for item in a_list:
    a_dict.setdefault(category_name + str(i+1), item)
    i += 1
return a_dict

Но , в вашем простом случае вы можете просто пойти на диктовку:

a_dict = {category_name + str(i): d for i, d in enumerate(a_list, 1)}
0 голосов
/ 11 июля 2019

Да, все сразу исправили.

for item in a_list:
        a_dict[(category_name + str(i))] = item
        i += 1
    return a_dict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...