Три списка в словаре

#python-3.x

#python-3.x

Вопрос:

У меня есть три списка, которые я хочу преобразовать в список словарей, следуя этой структуре:

Ожидаемый результат:

 [{'Chamber pop': {'url': '/wiki/Chamber_pop', 'description': 'xxx'},
{'Dance-punk': {'url': '/wiki/Dance-punk', 'description': 'yyy'}, 
{'Dream pop': {'url': '/wiki/Dream_pop', 'description': 'zzz'},
{'Dunedin Sound': {'url': 'Dunedin_Sound', 'description': 'aaa'}]
  

Списки:

 names = ['Chamber pop',
 'Dance-punk',
 'Dream pop',
 'Dunedin Sound',]

urls = ['/wiki/Chamber_pop',
 '/wiki/Dance-punk',
 '/wiki/Dream_pop',
 '/wiki/Dunedin_Sound']

description = ["xxx","yyy","zzz","aaa"]
  

То, что я пробовал до сих пор, это:

 res = {} 
for x in names: 
  for y in url:
      res[x] = {}
      res[x]["url"] = y
  

Однако вывод этого кода:

 {'Chamber pop': {'url': '/wiki/Twee_pop'},
 'Dance-punk': {'url': '/wiki/Twee_pop'},
 'Dream pop': {'url': '/wiki/Twee_pop'},
 'Dunedin Sound': {'url': '/wiki/Twee_pop'}}
  

Как вы можете видеть, значение URL продолжает повторяться. Я думаю, это потому, что где-то перезаписывается значение. Кроме того, он не имеет ожидаемой структуры, поскольку все это попадает в словарь.

Что я делаю не так? Был бы признателен за любую помощь.

Спасибо

Ответ №1:

Обычно zip() ваши списки позволяют выполнять параллельные итерации по ним. Тогда вы могли бы просто использовать понимание dict:

 names = ['Chamber pop','Dance-punk','Dream pop', 'Dunedin Sound',]  
urls = ['/wiki/Chamber_pop', '/wiki/Dance-punk', '/wiki/Dream_pop','/wiki/Dunedin_Sound']  
description = ["xxx","yyy","zzz","aaa"]

res = {n: {'url':u, 'description':d} 
 for n, u, d in zip(names, urls, description)}
  

что делает res =

 {'Chamber pop': {'url': '/wiki/Chamber_pop', 'description': 'xxx'},
 'Dance-punk': {'url': '/wiki/Dance-punk', 'description': 'yyy'},
 'Dream pop': {'url': '/wiki/Dream_pop', 'description': 'zzz'},
 'Dunedin Sound': {'url': '/wiki/Dunedin_Sound', 'description': 'aaa'}}
  

Ответ №2:

Похоже, что вы хотите перебирать списки вместе и сопоставлять их по индексу (от первого имени до первого URL-адреса и наоборот).

Что вы делаете, так это для каждого имени в вашем списке имен вы перебираете все URL-адреса и присваиваете на каждой итерации, фактически перезаписывая значение url. в результате последнему URL-адресу в вашем списке URL-адресов всегда присваивается значение для каждого имени.

Если вы добавите отпечатки, вы увидите, что последний URL-адрес для каждого имени является последним в списке:

 res = {} 
for x in names: 
    print(x)
    for y in urls:
        print(x, y)
        res[x] = {}
        res[x]["url"] = y
  

дает:

 Chamber pop
Chamber pop /wiki/Chamber_pop
Chamber pop /wiki/Dance-punk
Chamber pop /wiki/Dream_pop
Chamber pop /wiki/Dunedin_Sound
Dance-punk
Dance-punk /wiki/Chamber_pop
Dance-punk /wiki/Dance-punk
Dance-punk /wiki/Dream_pop
Dance-punk /wiki/Dunedin_Sound
Dream pop
Dream pop /wiki/Chamber_pop
Dream pop /wiki/Dance-punk
Dream pop /wiki/Dream_pop
Dream pop /wiki/Dunedin_Sound
Dunedin Sound
Dunedin Sound /wiki/Chamber_pop
Dunedin Sound /wiki/Dance-punk
Dunedin Sound /wiki/Dream_pop
Dunedin Sound /wiki/Dunedin_Sound
  

Что вы можете сделать, так это сопоставить их по индексу.
конечно, здесь есть скрытое предположение, что все ваши списки имеют одинаковую длину.

 final_res_dict = {}
for index in range(len(names)):
    name = names[index]
    final_res_dict[name] = {"url": urls[index], "description": description[index]}
    
  

что дает:

 {'Chamber pop': {'url': '/wiki/Chamber_pop', 'description': 'xxx'},
 'Dance-punk': {'url': '/wiki/Dance-punk', 'description': 'yyy'},
 'Dream pop': {'url': '/wiki/Dream_pop', 'description': 'zzz'},
 'Dunedin Sound': {'url': '/wiki/Dunedin_Sound', 'description': 'aaa'}}