字典清单

我是python的新手,我有一个嵌套列表,想要在其中使用以下数据创建字典,如下所示。

这是我的输入内容

input = 
[['103.29.45.128/27','32','ge','MPLS-LOOPBACK'],['100.127.0.0/23',['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_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','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': ''}]
x357904377 回答:字典清单

我已经编辑了您的代码,并根据您的要求获取了输出。

fsm_results = [['103.29.45.128/27','32','ge','MPLS-LOOPBACK'],['100.127.0.0/23',['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_condition': 'ge'}]},{'prefix_name': 'PS_S1','prefix_entry': [{'prefix': '100.92.57.168/30','prefix_match': '','prefix_condition': ''}]}]}
,

您可以使用defaultdict来缩短代码,只需循环两次:

from collections import defaultdict
res = defaultdict(list)

fsm_results = [['103.29.45.128/27','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_match': '32'}],'prefix_name': 'MPLS-LOOPBACK'},{'prefix_entry': [{'prefix': '100.92.57.168/30','prefix_condition': '','prefix_match': ''}],'prefix_name': 'PS_S1'}]}
,

使用setdefaultzip的解决方案:

public static ArrayList<Integer>[] checkerOddEven (int[] numbers){
    ArrayList<Integer> list[]; // I create an Array of ArrayLists
    list = new ArrayList[2]; // I allocate memory for two ArrayLists inside that array. It's important to note that without this,trying to do list[0]=new ArrayList<>(); would have crashed,because there's no list[] yet.
    list[0] = new ArrayList<>();list[1] = new ArrayList<>(); //I create the ArrayList instances by calling their constructor

    for(int number : numbers){
        if(oddEven(number)){
            list[0].add(number);
        }
        else list[1].add(number);
    }

    return list;
}

public static void main(String[] args) {
    Main main = new Main();
    ArrayList<Integer>[] listOfNumbers = (checkerOddEven(main.numbers));
    System.out.print("Odds: "); for(int i=0;i<listOfNumbers[0].size();i++) System.out.print(listOfNumbers[0].get(i)+" ");
    System.out.println(); 
    System.out.print("Even: "); for(int i=0;i<listOfNumbers[1].size();i++) System.out.print(listOfNumbers[1].get(i)+" ");
}

我希望这很重要。

,

之所以会这样,是因为您使用的是update,而不是附加到temp的列表中?

其他一些指针:不要使用range(len(somthing))。更好的方法是使用enumerate(somthing)enumerate返回索引和项目。

始终使用有意义的变量名。当您或其他人重新阅读您的代码并尝试理解它时,这将为您提供帮助。

本文链接:https://www.f2er.com/3168480.html

大家都在问