Список словаря - PullRequest
       1

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

3 голосов
/ 04 ноября 2019

Я новичок в python, у меня есть вложенный список, в котором я хочу создать словарь, как показано ниже, используя эти данные.

Это мой ввод:

input = 
[['103.29.45.128/27', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.127.0.0/23', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.92.57.168/30', '', '', 'PS_S1']
]

Ожидаемый результат должен бытькак показано ниже:

result = "prefix_set": [  
                          {
                            "prefix_entry": [
                                              {
                                                "prefix": "103.29.45.128/27",
                                                "prefix_match": "32",
                                                "prefix_condition": "ge"
                                              },
                                              {
                                                "prefix": "100.127.0.0/23",
                                                "prefix_match": "32",
                                                "prefix_condition": "ge"
                                              }
                                            ],
                            "prefix_name": "MPLS-LOOPBACK"
                          },
                          {
                            "prefix_entry": 
                                          [
                                              {
                                                "prefix": "100.92.57.168/30",
                                                "prefix_match": "",
                                                "prefix_condition": ""
                                              }  
                                          ],
                            "prefix_name": "PS_S1"
                          }
                      ]

Пожалуйста, помогите мне получить желаемый вывод.

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

fsm_results = [['103.29.45.128/27', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.127.0.0/23', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.92.57.168/30', '', '', 'PS_S1']
]


prefix_name = []
for i in fsm_results:
    prefix_name1 = i[3]
    if prefix_name1 not in prefix_name:
        prefix_name.append(prefix_name1)

temp1 = []
for i in range(0,len(prefix_name)):
    temp = {"prefix_name": prefix_name[i]} 
    for j in range(0,len(fsm_results)):
        if temp['prefix_name'] == fsm_results[j][3]:
            b = {"prefix":fsm_results[j][0],'prefix_match':fsm_results[j][1],'prefix_condition':fsm_results[j][2]}
            temp.update(b)
    temp1.append(temp)
print(temp1)

И я получаю вывод, как это:

   [{'prefix_name': 'MPLS-LOOPBACK', 'prefix': '100.127.0.0/23', 'prefix_match': '32', 'prefix_condition': 'ge'}, {'prefix_name': 'PS_S1', 'prefix': '100.92.57.168/30', 'prefix_match': '', 'prefix_condition': ''}]

Ответы [ 4 ]

2 голосов
/ 04 ноября 2019

Я отредактировал ваш код и получил вывод в соответствии с вашим требованием.

fsm_results = [['103.29.45.128/27', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.127.0.0/23', '32', 'ge', 'MPLS-LOOPBACK'], 
['100.92.57.168/30', '', '', 'PS_S1']
]

prefix_name = []
for i in fsm_results:
    prefix_name1 = i[3]
    if prefix_name1 not in prefix_name:
        prefix_name.append(prefix_name1)

temp1 = {"prefix_sets":[]}
for i in range(0,len(prefix_name)):
    temp = {"prefix_name": prefix_name[i],'prefix_entry':[]} 
    for j in range(0,len(fsm_results)):
        if temp['prefix_name'] == fsm_results[j][3]:
            b = {"prefix":fsm_results[j][0],'prefix_match':fsm_results[j][1],'prefix_condition':fsm_results[j][2]}
            temp['prefix_entry'].append(b)
    temp1["prefix_sets"].append(temp)
print(temp1)

Вывод

{'prefix_sets': [{'prefix_name': 'MPLS-LOOPBACK', 'prefix_entry': [{'prefix': '103.29.45.128/27', 'prefix_match': '32', 'prefix_condition': 'ge'}, {'prefix': '100.127.0.0/23', 'prefix_match': '32', 'prefix_condition': 'ge'}]}, {'prefix_name': 'PS_S1', 'prefix_entry': [{'prefix': '100.92.57.168/30', 'prefix_match': '', 'prefix_condition': ''}]}]}
1 голос
/ 04 ноября 2019

Решение с использованием setdefault и zip :

d = {}
for i in input:
    # Used setdefault method to get list of values with same index. Used zip function to group the values.
    d.setdefault(i[-1],[]).append(dict(zip(['prefix', 'prefix_match', 'prefix_condition'],i[:-1]))) 
res = {"prefix_set": [{"prefix_name":i ,"prefix_entry": v } for i, v in d.items()]}
print (res)

# Output:
{'prefix_set': [{'prefix_name': 'MPLS-LOOPBACK', 'prefix_entry': [{'prefix': '103.29.45.128/27', 'prefix_match': '32', 'prefix_condition': 'ge'}, {'prefix': '100.127.0.0/23', 'prefix_match': '32', 'prefix_condition': 'ge'}]}, {'prefix_name': 'PS_S1', 'prefix_entry': [{'prefix': '100.92.57.168/30', 'prefix_match': '', 'prefix_condition': ''}]}]}

Надеюсь, это считается.

1 голос
/ 04 ноября 2019

Вы можете использовать defaultdict , чтобы сократить код и просто выполнить цикл дважды:

from collections import defaultdict
res = defaultdict(list)

fsm_results = [['103.29.45.128/27', '32', 'ge', 'MPLS-LOOPBACK'],  ['100.127.0.0/23', '32', 'ge', 'MPLS-LOOPBACK'],  ['100.92.57.168/30', '', '', 'PS_S1']]
for fsm in fsm_results:
    name = fsm.pop()
    item = dict(zip(['prefix', 'prefix_match', 'prefix_condition'], fsm))
    res[name].append(item)

result = {'prefix_set': [{'prefix_name': k, 'prefix_entry': v} for (k, v) in res.items()]}
print result

Вывод:

{'prefix_set': [{'prefix_entry': [{'prefix': '103.29.45.128/27',
                                   'prefix_condition': 'ge',
                                   'prefix_match': '32'},
                                  {'prefix': '100.127.0.0/23',
                                   'prefix_condition': 'ge',
                                   'prefix_match': '32'}],
                 'prefix_name': 'MPLS-LOOPBACK'},
                {'prefix_entry': [{'prefix': '100.92.57.168/30',
                                   'prefix_condition': '',
                                   'prefix_match': ''}],
                 'prefix_name': 'PS_S1'}]}
0 голосов
/ 04 ноября 2019

Это происходит потому, что вы используете update вместо добавления в список в temp?

Некоторые другие указатели: Не используйте range(len(somthing)). Лучше всего использовать enumerate(somthing). enumerate возвращает индекс и элемент.

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

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