#python #list #loops #dictionary
#python #Список #циклы #словарь
Вопрос:
Я пытаюсь добавить несколько списков в один словарь, но похоже, что он печатает последнюю запись из цикла. Есть идеи, как я могу этого избежать?
list_orbited_planet = ["Earth", "Mars", "Pluto", "Uranus"]
low = ["Earth", "Mars", "Mars", "Uranus"]
high = ["Pluto", "Pluto", "Uranus"]
entities = {'low': low, 'high': high}
listPlanets = []
for i in range(len(list_orbited_planet)):
entities['low'] = low.count(list_orbited_planet[i])
entities['high'] = high.count(list_orbited_planet[i])
orbited_planet = {list_orbited_planet[i]: entities}
print(orbited_planet)
listPlanets.append(orbited_planet)
print(listPlanets)
Я хочу, чтобы мой вывод был таким:
[{'Earth': {'low': 1, 'high': 0}}, {'Mars': {'low': 2, 'high': 0}}, {'Pluto': {'low': 0, 'high': 2}}, {'Uranus': {'low': 1, 'high': 1}}]
Однако в каждом значении отображается только значение Uranus, поэтому оно буквально равно low = 1, high = 1 везде.
Комментарии:
1. Вау, это был мой первый пост на этом сайте, и я не ожидал, что так много ответов за такой короткий промежуток времени, спасибо, ребята!
Ответ №1:
Я хотел бы пойти немного дальше, чем предыдущие ответы, с несколькими советами:
- Зачем использовать
for i in range
цикл, когда вы могли бы просто сделатьfor planet in planets
? (гораздо более читаемый) - Вы определяете слишком много переменных s в этом цикле без какой-либо необходимости, что просто приведет к путанице. Каждая переменная должна представлять некоторую логическую сущность.
- Вам необходимо определять новый словарь на каждой итерации, иначе ранее определенный будет просто обновляться каждый раз.
Это может дать вам что-то вроде этого:
list_orbited_planet = ["Earth", "Mars", "Pluto", "Uranus"]
low = ["Earth", "Mars", "Mars", "Uranus"]
high = ["Pluto", "Pluto", "Uranus"]
listPlanets = []
for planet in list_orbited_planet:
orbited_planet = {
planet:
{
'low': low.count(planet),
'high': high.count(planet)
}
}
listPlanets.append(orbited_planet)
print(listPlanets)
Ответ №2:
list_orbited_planet = ["Earth", "Mars", "Pluto", "Uranus"]
low = ["Earth", "Mars", "Mars", "Uranus"]
high = ["Pluto", "Pluto", "Uranus"]
entities = {'low': low, 'high': high}
listPlanets = []
for i in range(len(list_orbited_planet)):
newEntities = dict()
newEntities['low'] = low.count(list_orbited_planet[i])
newEntities['high'] = high.count(list_orbited_planet[i])
orbited_planet = {list_orbited_planet[i]: newEntities}
print(orbited_planet)
listPlanets.append(orbited_planet)
print(listPlanets)
Поскольку на ваш entities
ссылаются для каждого цикла, они фактически манипулируют одной и той же переменной, которая хранится по тому же адресу. Поэтому просто объявите новую переменную, чтобы избежать такого поведения.
вывод:
{'Earth': {'low': 1, 'high': 0}}
{'Mars': {'low': 2, 'high': 0}}
{'Pluto': {'low': 0, 'high': 2}}
{'Uranus': {'low': 1, 'high': 1}}
[{'Earth': {'low': 1, 'high': 0}}, {'Mars': {'low': 2, 'high': 0}}, {'Pluto': {'low': 0, 'high': 2}}, {'Uranus': {'low': 1, 'high': 1}}]
Ответ №3:
Проблема в том, что orbited_planet = {list_orbited_planet[i]: entities}
всегда используется один и тот же словарь entities
для каждой планеты. Это означает, что каждая планета использовала один и тот же словарь, значения которого были установлены в последний раз при последнем прохождении цикла. Одним из решений является изменение этой строки на
orbited_planet = {list_orbited_planet[i]: entities.copy()}
и это будет работать так, как ожидалось.
Ответ №4:
Вы можете использовать временный словарь в цикле, например:
list_orbited_planet = ["Earth", "Mars", "Pluto", "Uranus"]
low = ["Earth", "Mars", "Mars", "Uranus"]
high = ["Pluto", "Pluto", "Uranus"]
entities = {'low': low, 'high': high}
listPlanets = []
for i in range(len(list_orbited_planet)):
tmp_entities = {}
tmp_entities['low'] = low.count(list_orbited_planet[i])
tmp_entities['high'] = high.count(list_orbited_planet[i])
orbited_planet = {list_orbited_planet[i]: tmp_entities}
listPlanets.append(orbited_planet)
print(listPlanets)
что дает следующий результат:
[{'Earth': {'low': 1, 'high': 0}}, {'Mars': {'low': 2, 'high': 0}}, {'Pluto': {'low': 0, 'high': 2}}, {'Uranus': {'low': 1, 'high': 1}}]
Если entities
он больше нигде не нужен, вы также можете удалить его.
Ответ №5:
У вас небольшая ошибка в вашем цикле foor. Попробуйте этот более читаемый способ:
for planet in list_orbited_planet:
entities = {'low': low.count(planet), 'high':high.count(planet)}
listPlanets.append({planet: entities})
print(listPlanets)
Output: [{'Earth': {'low': 1, 'high': 0}}, {'Mars': {'low': 2, 'high': 0}}, {'Pluto': {'low': 0, 'high': 2}}, {'Uranus': {'low': 1, 'high': 1}}]