Как отсортировать словарь, который указан в списке

#python #list #function #dictionary

#python #Список #функция #словарь

Вопрос:

Я должен написать функцию, которая позволит вам добавлять новую планету в качестве словаря в список. Проблема в том, что список должен быть отсортирован. Так, например, для input: name = Earth вывода будет: {'name': 'Earth', 'density': '123.123'}] [{'name': 'Mars', 'density': 5.427}, {'name': 'Venus', 'density': 5.513}, вместо: [{'name': 'Mars', 'density': 5.427}, {'name': 'Venus', 'density': 5.513}, {'name': 'Earth', 'density': '123.123'}]

 My code:
base = [
    {"name": "Mars", "density": 5.427},
    {"name": "Venus", "density": 5.513},
]
name = input("Enter the name of the planet: ")
destiny = input("Enter the density of the planet: ")


def addPlanet(name, destiny, base):
    new_planet = {"name": name, "density": destiny}
    base.append(new_planet)
    return base


addPlanet(name, destiny, base)
print(base)
 

Комментарии:

1. Сортируется в соответствии с каким правилом?

2. Алфавитный порядок

3. В соответствии со name значениями?

4. Да, в соответствии с именем

Ответ №1:

просто добавьте base.sort(key=lambda x: x['name']) после вашего addPlanet() .

Кстати, ваша функция не должна получать и возвращать base , поскольку она является глобальной.

Комментарии:

1. Можно ли это сделать без использования функции сортировки?

2. вы имеете в виду сортировку без использования встроенной функции сортировки ()?

3. Да, без сортировки () и сортировки ()

4. ну, вы можете пересечь свой список, если ваше имя> current_name . а затем используйте insert для ввода вашего нового dict в эту позицию

5. Лиор ата ах якар!

Ответ №2:

Вы можете сделать это так, без функции сортировки:

 def addPlanet(name, destiny, base):
    # Cast to float
    new_planet = {"name": name, "density": float(destiny)}
    index = 0
    # Find where to place the new_planet
    while name > base[index]["name"]:
        index  = 1
    # Insert it and move other planets by one
    for i in range(index, len(base)):
        temp = base[i]
        base[i] = new_planet
        new_planet = temp
    # For the last one append to increase the size of the array
    base.append(temp)
 

Ответ №3:

В вашем примере у вас есть числа (с плавающей запятой) для базовых плотностей. Но, когда вы вставляете новый, вы не преобразуете строку в float.

Итак, в нем отсутствует float(density) или, как показано ниже:

 density = float(input("Enter the density of the planet: "))
 

Примечание: это доверие к тому, что пользователь ввел число, а не имя. Другими словами, если пользователь введет, например, , test , он сгенерирует исключение

Кроме того, это не проблема, но вы назвали переменную destiny вместо density .

Чтобы распечатать его по порядку, вы можете:

 # Sort by name
print(sorted(base, key=lambda p: p["name"]))

# Sort by density
print(sorted(base, key=lambda p: p["density"]))
 

Кроме того, вы могли бы использовать функцию для этого

 def sort_by_name(x):
    return x["name"]

def sort_by_density(x):
    return x["density"]

# Sort by name
print(sorted(base, key=sort_by_name))

# Sort by density
print(sorted(base, key=sort_by_density))