从列表中的两个嵌套字典中检索值

时间:2020-04-01 09:34:53

标签: python json list dictionary nested

我正在python 3.7中使用api调用,该调用返回json数据。

string xml = @"<?xml version=""1.0""?>
    <restaurants xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
    <restaurant>
    <name>Laughing Man</name>
    <logo>
    <name>Visit the Laughing Man</name>
    <imagefile>laughing-man.gif</imagefile>
    <width unit=""px"">50</width>
    <height unit=""px"">200</height>
    </logo>
    </restaurant>
    <restaurant>
    <name>Gong&#x2019;s Asian Cuisine</name>
    <logo>
    <name/>
    <imagefile>gong-asian-cuisine.gif</imagefile>
    <width unit=""px"">150</width>
    <height unit=""px"">250</height>
    </logo>
    </restaurant>
    </restaurants>";
List<string> names = new List<string>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNodeList nodes = xmlDoc.SelectNodes("/restaurants/restaurant");
foreach (XmlNode itemNode in nodes)
{
    XmlNode titleNode = itemNode.SelectSingleNode("name");
    if (titleNode != null)
    {
        names.Add(titleNode.InnerText);
    }
}

返回的数据似乎是列表中两个嵌套字典的形式,即

result = (someapicall)

我想从第一个字典中检索键“ name”的值,并从两个字典中检索键“ firmware”的值,并以以下格式存储在新词典中。

[{name:foo, firmware:boo}{name:foo, firmware:bar}]

到目前为止,我已经设法检索了第一个“名称”和第一个“固件”的值,并使用以下命令将其存储在字典中。

{foo:(boo,bar)}

我尝试过。

dict1={}
for i in  result:
 dict1[(i["networkId"])] = (i['firmware']) 

但是正如预期的那样,以上似乎返回了相同的固件两次。

任何人都可以帮助实现以上期望的结果

1 个答案:

答案 0 :(得分:3)

您可以使用defaultdict来累积列表中的值,如下所示:

from collections import defaultdict

result = [{'name':'foo', 'firmware':'boo'},{'name':'foo', 'firmware':'bar'}]

# create a dict with a default of empty list for non existing keys
dict1=defaultdict(list)

# iterate and add firmwares of same name to list
for i in result:
  dict1[i['name']].append(i['firmware'])

# reformat to regular dict with tuples
final = {k:tuple(v) for k,v in dict1.items()}

print(final)

输出:

{'foo': ('boo', 'bar')}