首页 > 解决方案 > 不确定如何操作子字典

问题描述

我正在使用 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"}]}

如果可能的话,我想组合更多的字段,但是可以像这样加入这些字典吗?

标签: pythonpython-3.6

解决方案


设置

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

推荐阅读