Соответствие между словарями в списке

Здравствуйте, ребята, у меня вопрос, как установить соответствие между словарями

я отправил 3 запроса на youtube api

первый к поиску второй к видео третий к каналу

Что я пытаюсь создать, так это дик, который имеет

  • Title of the video
  • Thumbnails of the video
  • and the profile of the channel that make the video.

Здесь вы можете увидеть код и запросы, которые я отправляю:

 def get(self,request):
    search_url = "https://www.googleapis.com/youtube/v3/search"
    video_url = "https://www.googleapis.com/youtube/v3/videos"
    channel_url = "https://www.googleapis.com/youtube/v3/channels?part=snippet&id='+commaSeperatedList+'&fields=items(id%2Csnippet%2Fthumbnails)&key={}".format(settings.YOUTUBE_DATA_API_KEY)


    para_search = {
      'part': 'snippet',
      'q': 'Learn Python' ,
      'key': settings.YOUTUBE_DATA_API_KEY,
      'maxResults': 3,
      'type': 'video'

    }

    search_response = requests.get(search_url,params=para_search)
    
    print(search_response.text)
    results = search_response.json()['items']
    ids =[]
    for result in results:
      ids.append(result['id']['videoId'])


    para_videos = {
      'part': 'snippet',
      'key': settings.YOUTUBE_DATA_API_KEY,
      'id':','.join(ids),
    }
    video_response = requests.get(video_url, params=para_videos)
    print(video_response.text)
    results = video_response.json()['items']
    dict_youtube  = {}
    list_youtube = []
    channelIdList = []
    for result in results:
      dict_youtube  = {
         'title': result['snippet']['title'],
         'thumbnails': result['snippet']['thumbnails']['high']['url'],
         'channelId': result['snippet']["channelId"],
       }
      channelIdList.append(result['snippet']["channelId"])
      list_youtube.append(dict_youtube)



    param_channel = {
      'part':'snippet,contentDetails,statistics',
      'key':settings.YOUTUBE_DATA_API_KEY,
      'id':','.join(channelIdList)
    }
    channel_response = requests.get(channel_url,params=param_channel)
    print(channel_response.text)
    results = channel_response.json()['items']
    profile = []
    profile_dic = {}
    for result in results:
      profile_dic = {
        'channelId': result['id'],
        'profile': result['snippet']['thumbnails']['default']['url'],
      }
      profile.append(profile_dic)
    print(profile)
    print(list_youtube)

print(profile):

[{'channelId': 'UC8butISFwT-', 'profile': 'https://yt3.ggpht.com/ytc/AifQn-nYNfkgLvVPkw=s88-********-no-rj'}, {'channelId': 'UCWv7*mDpPBA', 'profile': 'https://yt3.ggpht.com/tBEPr-zTNXEeae7VZK2PXSwzMBKVR7W0MI7gyND8=s88-c-k-c0x00ffffff-no-rj'}]

print(list_youtube)

[{'title': 'Learn Python - Full Course for Beginners [Tutorial]', 'thumbnails': 'https://i.ytimg.com/vi/rfbw/hqdefault.jpg', 'channelId': 'UCwT-Wl7EV0hUK0BQ'}, {'title': 'Python for Beginners - Learn Python in 1 Hour', 'thumbnails': 'https://i.ytimg.com/vi/kqt8/hqdt.jpg', 'channelId': 'UCWv7pPBA'}, {'title': 'Python Tutorial - Python Full Course for Beginners', 'thumbnails': 'https://i.ytimg.com/vi/_uQrJ0TkZlc/hqdefault.jpg', 'channelId': 'UPBA'}]

Как вы видите, я создал два списка, каждый из которых содержит словари.

И каждый словарь имеет общий ключ, который я создал, и это channelId

.

Я хочу сделать объединение словарей, имеющих одинаковое значение в ключе channelId, причем первый список имеет меньше словарей, чем второй.

Как мне объединить два списка и словари так, чтобы все было совместимо, что в итоге у меня будет список со словарями, в котором есть ключ

  1. 'title':
  2. 'thumbnails':
  3. 'channelId':
  4. 'profile':

например, что-то вроде этого:

[{'title':.... , 'thumbnails':... , 'channelId':... , 'profile':... ,} , { ... }, ...]

Это похоже на классическую операцию объединения. Вы можете использовать фильтр для идентификации элементов, которые совпадают по id, а затем обновить словарь его значениями, как показано ниже.

Предполагается, что у вас есть не более 1 видео на профиль. Вам может понадобиться перевернуть переменные/добавить логику в зависимости от их отношения

for dic in profile:
    vids = filter(lambda yt: yt["channelId"] == dic["channelId"], list_youtube)
    for vid in vids:
        dic.update(vid)
    return dic
Вернуться на верх