Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python搜索复杂的数据结构_Python_Json - Fatal编程技术网

用Python搜索复杂的数据结构

用Python搜索复杂的数据结构,python,json,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',

我对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需要上面的辅助源

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

提前谢谢

类似这样:

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

每当您需要在您的案例中使用一个键时,在您的案例中查找另一段数据的主机名,服务器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]

您可以使用“过滤器”将其作为一个衬里来执行:

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

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']

这看起来像Python,而不是JSON。谢谢!这似乎奏效了。我喜欢这一行的优雅:
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']