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