迭代字典并提取值
Iteration over the dictionary and extracting values
我有一个字典 (result_dict) 如下。
{'11333216@N05': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 3,
'iconserver': '2214',
'id': '11333216@N05',
'ispro': 0,
'location': {'_content': ''},
'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'},
'nsid': '11333216@N05',
'path_alias': 'kishansamarasinghe',
'photos': {'count': {'_content': 442},
'firstdate': {'_content': '1193073180'},
'firstdatetaken': {'_content': '2000-01-01 00:49:17'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'},
'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'},
'realname': {'_content': 'Kishan Samarasinghe'},
'timezone': {'label': 'Sri Jayawardenepura',
'offset': '+06:00',
'timezone_id': 'Asia/Colombo'},
'username': {'_content': 'Three Sixty Five Degrees'}},
'stat': 'ok'},
'117692977@N08': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '0',
'iconfarm': 1,
'iconserver': '404',
'id': '117692977@N08',
'ispro': 0,
'location': {'_content': 'Almere, The Nederlands'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'},
'nsid': '117692977@N08',
'path_alias': 'meijsvo',
'photos': {'count': {'_content': 3237},
'firstdate': {'_content': '1392469161'},
'firstdatetaken': {'_content': '2013-06-23 14:39:30'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'},
'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'},
'realname': {'_content': 'Markéta Eijsvogelová'},
'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna',
'offset': '+01:00',
'timezone_id': 'Europe/Amsterdam'},
'username': {'_content': 'meijsvo'}},
'stat': 'ok'},
'21539776@N02': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 0,
'iconserver': '0',
这包含超过 150 个用户名 (e.g. 11333216@N05)
。我想为每个用户提取 'mobileurl'
并创建一个包含 username
和 mobileurl
列的数据框。我找不到一种方法来迭代每个用户并提取他的 mobileurl
因为索引是不可能的。但是,我已经为其中一位用户提取了 mobileurl,如下所示。
result_dict['76617062@N08']["person"]["mobileurl"]['_content']
'https://m.flickr.com/photostream.gne?id=76524249'
如果有人能提供帮助,我将不胜感激,因为我对 python 有点陌生。
遍历字典的键列表,在本例中是用户名,然后使用每个键访问每个顶级字典,然后从那里深入所有其他层以找到您需要的确切数据。您示例中的 mobileurl。
获得这 2 个变量后,将它们添加到数据框中。
# Iterate through list of users
for user in result_dict.keys():
# use each username to find the mobileurl you need within
mobileurl = result_dict[user]["person"]["mobileurl"]["_content"]
# Add the variables 'user' and 'mobileurl' to dataframe as you see fit
result_dict = {'11333216@N05': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 3,
'iconserver': '2214',
'id': '11333216@N05',
'ispro': 0,
'location': {'_content': ''},
'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'},
'nsid': '11333216@N05',
'path_alias': 'kishansamarasinghe',
'photos': {'count': {'_content': 442},
'firstdate': {'_content': '1193073180'},
'firstdatetaken': {'_content': '2000-01-01 00:49:17'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'},
'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'},
'realname': {'_content': 'Kishan Samarasinghe'},
'timezone': {'label': 'Sri Jayawardenepura',
'offset': '+06:00',
'timezone_id': 'Asia/Colombo'},
'username': {'_content': 'Three Sixty Five Degrees'}},
'stat': 'ok'},
'117692977@N08': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '0',
'iconfarm': 1,
'iconserver': '404',
'id': '117692977@N08',
'ispro': 0,
'location': {'_content': 'Almere, The Nederlands'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'},
'nsid': '117692977@N08',
'path_alias': 'meijsvo',
'photos': {'count': {'_content': 3237},
'firstdate': {'_content': '1392469161'},
'firstdatetaken': {'_content': '2013-06-23 14:39:30'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'},
'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'},
'realname': {'_content': 'Markéta Eijsvogelová'},
'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna',
'offset': '+01:00',
'timezone_id': 'Europe/Amsterdam'},
'username': {'_content': 'meijsvo'}},
'stat': 'ok'},
'21539776@N02': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 0,
'iconserver': '0'}
}
}
对于您的用例,最好使用字典的 iteritems():
for key, value in result_dict.iteritems():
print value.get("person", {}).get("mobileurl", {}).get("_content")
输出
https://m.flickr.com/photostream.gne?id=117600164
https://m.flickr.com/photostream.gne?id=11327876
我认为您也可以尝试更多地使用 pandas 方式而不是纯粹的字典迭代。它不一定是最快的,但鉴于您是 python 和 pandas 的新手,我认为知道 pandas 可以很好地处理这个问题是件好事。
我假设您使用的是 pandas DataFrame
,而不仅仅是字典。您可以轻松实现相同的目的,而无需将 json 转换为 pandas DataFrame
。即,即使您不是 pandas DataFrame
,其他答案也会起作用。它们也是有效的 python 字典语法。
urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content'])
这里我们选择了索引为 person
的所有行,然后我们尝试 apply
一个函数(lambda 是我们将使用的匿名函数)到每个
person
。在这种情况下,我们使用 lambda
函数提取 url,然后 pandas 将结果转换回 pandas DataFrame
(或 Series
)你使用。
通常我也会关心我的迭代速度有多快。
(以下是在 IPython 中完成的,一个很好的工具,你可以在 python 中使用它来做很多事情。%%timeit 是 IPython 为你提供的一个神奇的功能计算
您的代码可能需要的时间)
%timeit
urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content'])
1000 loops, best of 3: 133 us per loop (us = microsecond, 10e-6)
@SamC 在这里提供了快速解决方案,我可以告诉你。但就像我说的,你不需要 DataFrame
来使用他的解决方案。它也适用于普通字典。
我有一个字典 (result_dict) 如下。
{'11333216@N05': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 3,
'iconserver': '2214',
'id': '11333216@N05',
'ispro': 0,
'location': {'_content': ''},
'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'},
'nsid': '11333216@N05',
'path_alias': 'kishansamarasinghe',
'photos': {'count': {'_content': 442},
'firstdate': {'_content': '1193073180'},
'firstdatetaken': {'_content': '2000-01-01 00:49:17'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'},
'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'},
'realname': {'_content': 'Kishan Samarasinghe'},
'timezone': {'label': 'Sri Jayawardenepura',
'offset': '+06:00',
'timezone_id': 'Asia/Colombo'},
'username': {'_content': 'Three Sixty Five Degrees'}},
'stat': 'ok'},
'117692977@N08': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '0',
'iconfarm': 1,
'iconserver': '404',
'id': '117692977@N08',
'ispro': 0,
'location': {'_content': 'Almere, The Nederlands'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'},
'nsid': '117692977@N08',
'path_alias': 'meijsvo',
'photos': {'count': {'_content': 3237},
'firstdate': {'_content': '1392469161'},
'firstdatetaken': {'_content': '2013-06-23 14:39:30'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'},
'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'},
'realname': {'_content': 'Markéta Eijsvogelová'},
'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna',
'offset': '+01:00',
'timezone_id': 'Europe/Amsterdam'},
'username': {'_content': 'meijsvo'}},
'stat': 'ok'},
'21539776@N02': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 0,
'iconserver': '0',
这包含超过 150 个用户名 (e.g. 11333216@N05)
。我想为每个用户提取 'mobileurl'
并创建一个包含 username
和 mobileurl
列的数据框。我找不到一种方法来迭代每个用户并提取他的 mobileurl
因为索引是不可能的。但是,我已经为其中一位用户提取了 mobileurl,如下所示。
result_dict['76617062@N08']["person"]["mobileurl"]['_content']
'https://m.flickr.com/photostream.gne?id=76524249'
如果有人能提供帮助,我将不胜感激,因为我对 python 有点陌生。
遍历字典的键列表,在本例中是用户名,然后使用每个键访问每个顶级字典,然后从那里深入所有其他层以找到您需要的确切数据。您示例中的 mobileurl。
获得这 2 个变量后,将它们添加到数据框中。
# Iterate through list of users
for user in result_dict.keys():
# use each username to find the mobileurl you need within
mobileurl = result_dict[user]["person"]["mobileurl"]["_content"]
# Add the variables 'user' and 'mobileurl' to dataframe as you see fit
result_dict = {'11333216@N05': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 3,
'iconserver': '2214',
'id': '11333216@N05',
'ispro': 0,
'location': {'_content': ''},
'mbox_sha1sum': {'_content': '8eb2e248cbad94e2b4a5aae75eb653c7e061a90c'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=11327876'},
'nsid': '11333216@N05',
'path_alias': 'kishansamarasinghe',
'photos': {'count': {'_content': 442},
'firstdate': {'_content': '1193073180'},
'firstdatetaken': {'_content': '2000-01-01 00:49:17'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/kishansamarasinghe/'},
'profileurl': {'_content': 'https://www.flickr.com/people/kishansamarasinghe/'},
'realname': {'_content': 'Kishan Samarasinghe'},
'timezone': {'label': 'Sri Jayawardenepura',
'offset': '+06:00',
'timezone_id': 'Asia/Colombo'},
'username': {'_content': 'Three Sixty Five Degrees'}},
'stat': 'ok'},
'117692977@N08': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '0',
'iconfarm': 1,
'iconserver': '404',
'id': '117692977@N08',
'ispro': 0,
'location': {'_content': 'Almere, The Nederlands'},
'mobileurl': {'_content': 'https://m.flickr.com/photostream.gne?id=117600164'},
'nsid': '117692977@N08',
'path_alias': 'meijsvo',
'photos': {'count': {'_content': 3237},
'firstdate': {'_content': '1392469161'},
'firstdatetaken': {'_content': '2013-06-23 14:39:30'}},
'photosurl': {'_content': 'https://www.flickr.com/photos/meijsvo/'},
'profileurl': {'_content': 'https://www.flickr.com/people/meijsvo/'},
'realname': {'_content': 'Markéta Eijsvogelová'},
'timezone': {'label': 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna',
'offset': '+01:00',
'timezone_id': 'Europe/Amsterdam'},
'username': {'_content': 'meijsvo'}},
'stat': 'ok'},
'21539776@N02': {'person': {'can_buy_pro': 0,
'description': {'_content': ''},
'has_stats': '1',
'iconfarm': 0,
'iconserver': '0'}
}
}
对于您的用例,最好使用字典的 iteritems():
for key, value in result_dict.iteritems():
print value.get("person", {}).get("mobileurl", {}).get("_content")
输出
https://m.flickr.com/photostream.gne?id=117600164
https://m.flickr.com/photostream.gne?id=11327876
我认为您也可以尝试更多地使用 pandas 方式而不是纯粹的字典迭代。它不一定是最快的,但鉴于您是 python 和 pandas 的新手,我认为知道 pandas 可以很好地处理这个问题是件好事。
我假设您使用的是 pandas DataFrame
,而不仅仅是字典。您可以轻松实现相同的目的,而无需将 json 转换为 pandas DataFrame
。即,即使您不是 pandas DataFrame
,其他答案也会起作用。它们也是有效的 python 字典语法。
urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content'])
这里我们选择了索引为 person
的所有行,然后我们尝试 apply
一个函数(lambda 是我们将使用的匿名函数)到每个
person
。在这种情况下,我们使用 lambda
函数提取 url,然后 pandas 将结果转换回 pandas DataFrame
(或 Series
)你使用。
通常我也会关心我的迭代速度有多快。
(以下是在 IPython 中完成的,一个很好的工具,你可以在 python 中使用它来做很多事情。%%timeit 是 IPython 为你提供的一个神奇的功能计算 您的代码可能需要的时间)
%timeit
urls = result_dict[result_dict.index=='person'].apply(lambda x: x['mobileurl']['_content'])
1000 loops, best of 3: 133 us per loop (us = microsecond, 10e-6)
@SamC 在这里提供了快速解决方案,我可以告诉你。但就像我说的,你不需要 DataFrame
来使用他的解决方案。它也适用于普通字典。