在Python中搜索复杂的数据结构

时间:2014-07-01 15:30:19

标签: python json

我对Python比较陌生,所以我一直在教自己。 我需要编写一个解析JSON输出的脚本,看起来像这样:

[{u'serverId': 117, u'hostName': u'bla', u'ipAddress': u'10.0.0.1', u'id': 163},
{u'serverId': 221, u'hostName': u'bla2', u'ipAddress': u'10.0.0.1', u'id': 380},
{u'serverId': 213, u'hostName': u'bla2', u'ipAddress': u'10.0.0.3', u'id': 658}]

依此类推,等等......

我有一个主数据源,我遍历以获取主机名。 服务器标识需要辅助源(上面)。

如何使用第一个数据源中的主机名获取相应的ID?

提前致谢!

3 个答案:

答案 0 :(得分:0)

这样的事情:

my_list = []

# Read in json file
with open('file.json') as in_file:
    my_list = json.load(in_file) 

for row in my_list:  # Loop through the array
    if isinstance(row, dict):  # Check we are dealing with a dictionary
        if row.get('hostName', '') == 'bla':  # compare values
            print(row.get('id', None))  # Do something

答案 1 :(得分:0)

每当您需要使用密钥(在您的情况下,主机名)查找另一个数据(在您的情况下,服务器ID)时,通常Python中最合适的数据结构是字典。在这种情况下,您可能希望根据JSON数据构建字典,如下所示:

server_id_mapping = {}
for server_info in json.loads(data_source_2):
    server_id_mapping[server_info['hostName']] = server_info['serverId']

然后,要从主机名获取服务器ID,只需使用:

server_id = server_id_mapping[hostname]

答案 2 :(得分:0)

您可以使用filter()

以单行方式执行此操作
filter(lambda d: d['hostName'] == hostName, json.loads(data))

这将返回一个空列表或数据元素列表(以字典形式),其中hostName键等于hostName。然后您可以按如下方式使用它:

entries = filter(
    lambda d: d['hostName'] == hostName,
    json.loads(data)
)

if not entries:
    raise KeyError('There is no entry with that host name.')

id = entries[0]['id']