python - 不确定如何操作子字典
问题描述
我正在使用 Twitch API 并最终得到以下词典:
用户数据
{"data": [
{"display_name": "John", "id": "123"},
{"display_name": "Frank", "id": "456"},
{"display_name": "Billy", "id": "789"}]}
流数据
{"data": [
{"id": "333444", "user_id": "456", "title": "Franks Stream"}
{"id": "555666", "user_id": "789", "title": "Billys Stream"}
{"id": "111222", "user_id": "123", "title": "Johns Stream"}]}
我不能保证两者的顺序是相同的,所以我想要使用 id/user_id 将两者结合起来:
组合数据
{"data": [
{"id": "333444", "user_id": "456", "title": "Franks Stream", "display_name": "Frank"}
{"id": "555666", "user_id": "789", "title": "Billys Stream", "display_name": "Billy"}
{"id": "111222", "user_id": "123", "title": "Johns Stream", "display_name": "John"}]}
如果可能的话,我想组合更多的字段,但是可以像这样加入这些字典吗?
解决方案
设置
user_data = {
"data": [
{"display_name": "John", "id": "123"},
{"display_name": "Frank", "id": "456"},
{"display_name": "Billy", "id": "789"}]}
stream_data = {
"data": [
{"id": "333444", "user_id": "456", "title": "Franks Stream"},
{"id": "555666", "user_id": "789", "title": "Billys Stream"},
{"id": "111222", "user_id": "123", "title": "Johns Stream"}]}
解决方案
使用字典推导,您可以创建一个新的用户数据字典,该字典以id
字段为键,然后使用此数据更新流数据。
new_user_data = {row.get("id"): row.get('display_name')
for row in user_data['data']}
>>> new_user_data
{'123': 'John', '456': 'Frank', '789': 'Billy'}
现在使用这个字典来更新display_name
数据(如果你不想改变原始数据,你可能希望制作一个副本)。
for row in stream_data['data']:
id_ = row.get('user_id')
row['display_name'] = new_user_data[id_]
>>> stream_data['data']
[{'display_name': 'Frank',
'id': '333444',
'title': 'Franks Stream',
'user_id': '456'},
{'display_name': 'Billy',
'id': '555666',
'title': 'Billys Stream',
'user_id': '789'},
{'display_name': 'John',
'id': '111222',
'title': 'Johns Stream',
'user_id': '123'}]
如果您有多个用户数据要存储为值(即不仅仅是id
作为键和display_name
值),您可以使用 anamedtuple
来保存它们。
user_data = {
"data": [
{"display_name": "John", "id": "123", "description": "boring"},
{"display_name": "Frank", "id": "456", "description": "smart"},
{"display_name": "Billy", "id": "789", "description": "funny"}]}
from collections import namedtuple
UserData = namedtuple('UserData', ('display_name', 'description'))
for row in user_data['data']:
id_ = row.pop('id')
new_user_data[id_] = UserData(**row)
for row in stream_data['data']:
id_ = row.get('user_id')
row.update(**new_user_data[id_].__dict__)
>>> new_user_data
{'123': UserData(display_name='John', description='boring'),
'456': UserData(display_name='Frank', description='smart'),
'789': UserData(display_name='Billy', description='funny')}
>>> stream_data
{'data': [
{'description': 'smart',
'display_name': 'Frank',
'id': '333444',
'title': 'Franks Stream',
'user_id': '456'},
{'description': 'funny',
'display_name': 'Billy',
'id': '555666',
'title': 'Billys Stream',
'user_id': '789'},
{'description': 'boring',
'display_name': 'John',
'id': '111222',
'title': 'Johns Stream',
'user_id': '123'}]}
推荐阅读
- javascript - 以螺旋形式生成二维数组
- javascript - 在 WebStorm 中通过断言的测试失败
- c++ - 如何通过 CMake 获取 STATIC 库默认值
- java - 使 EJB @Schedule 中的方法只被调用一次
- angular - 当我在 WAVE 扩展结果中为离子输入标签使用 clearInput 属性时,出现空按钮名称错误。有没有人遇到过类似的问题?
- javascript - Safari 不包括 COOKIE 到第二个 CORS 请求
- javascript - 从 Electron 中所需的 JS 模块访问父变量
- ios - UIActivityViewController 用于发送带有图片、url 和文本的短信
- java - Android 应用程序,出现错误“java.lang.NullPointerException:println 需要一条消息”
- laravel - 不允许客人访问某些路线