Как добавить список в словарь с помощью цикла

#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:

Я хотел бы пойти немного дальше, чем предыдущие ответы, с несколькими советами:

  1. Зачем использовать for i in range цикл, когда вы могли бы просто сделать for planet in planets ? (гораздо более читаемый)
  2. Вы определяете слишком много переменных s в этом цикле без какой-либо необходимости, что просто приведет к путанице. Каждая переменная должна представлять некоторую логическую сущность.
  3. Вам необходимо определять новый словарь на каждой итерации, иначе ранее определенный будет просто обновляться каждый раз.

Это может дать вам что-то вроде этого:

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