Как да сортирате речник на Python по ключ или стойност

В този урок ще научите как да сортирате речник на Python по неговия ключ или стойност.

Когато работите с речник в Python, има моменти, когато ще трябва да сортирате съдържанието му – по ключ или по стойност. Тъй като речникът на Python е съпоставяне на ключ-стойност, ще създадете нов речник, който има ключовете или стойностите, сортирани според нуждите.

В този урок ще започнем с преглед на основите на речника на Python. След това ще се научим да създаваме нов речник, в който съдържанието е сортирано по ключ или по стойност, според нуждите.

Основи на речника на Python, преразгледан

Какво е речник на Python?

Речникът е вградена структура от данни в Python. Той съхранява елементи като двойки ключ-стойност. Можете да използвате клавишите, за да търсите съответните стойности. Тъй като ключовете уникално идентифицират стойностите, не трябва да има повторение на ключовете.

py_dict = {"Python":"cool!","Learn":True}
py_dict["Python"]
# Output: cool!

py_dict["Learn"]
# Output: True

Функционално речникът е подобен на хеш карта. Следователно, това не е непременно подредена структура от данни. Можете да получите достъп до съдържанието на речник в произволен ред, стига да знаете ключовете.

Подреждане на елементи в речник

В по-ранните версии на Python трябваше да използвате an OrderedDict за да запазите реда на клавишите. От Python 3.7 обаче можете да получите достъп до елементите в същия ред, в който ги добавяте към речника.

Сега, след като научихте основите на речниците на Python, нека научим как да създаваме сортирани копия на речника.

⚙️ Забележка: Трябва да имате Python 3.7 или по-нова версия, за да работи кодът в този урок според очакванията. Можете да изтеглите най-новата версия на Pythonили стартирайте примерите в pctechbg.net Online Python Editor.

  Как да използвате GIF файлове в Signal

Как да сортирате речник на Python по ключ

Вижте следното изображение на десертното меню в кафене. Има две колони, съответстващи на позициите в менюто и съответните им цени.

Можете да представите това под формата на речник на Python, като съберете имената на елементите като ключове и техните цени като стойности.

Нека да продължим и да създадем речниковите десерти, както е показано по-долу.

desserts = {
    "Ice cream":10,
    "Brownies":12,
    "Cheesecake":3,
    "Swiss roll":5,
    "Cookies":4,
    "Cup cake":2
}

След това нека създадем речник sorted_desserts, където десертите са подредени по азбучен ред. В оригиналния речник на десертите имената на десертите са ключовите. Така че трябва да сортирате тези ключове по азбучен ред, за да създадете нов речник.

Как да получите достъп до ключовете на речник на Python

За да направим това, първо ще вземем ключовете на речника и след това ще ги сортираме по азбучен ред.

В Python можете да използвате вградения метод на речника .keys(), за да получите списък с всички ключове в речника.

Нека извикаме метода .keys() на речника на десерта, за да извлечем ключовете, както е показано по-долу.

keys = desserts.keys()
print(keys)

#Output
['Ice cream', 'Brownies', 'Cheesecake', 'Swiss roll', 'Cookies', 
'Cup cake']

Извикването на вградената функция sorted() на Python със списък като аргумент връща нов сортиран списък.

След това нека извикаме функцията sorted() с ключовете на списъка като аргумент и да съхраним сортирания списък в променливата sorted_keys.

sorted_keys = sorted(keys)
print(sorted_keys)

# Output
['Brownies', 'Cheesecake', 'Cookies', 'Cup cake', 'Ice cream', 'Swiss roll']

Сега, след като ключовете са сортирани по азбучен ред, можем да търсим стойностите, съответстващи на ключовете в sorted_keys от речника на десертите, както е показано по-долу.

sorted_desserts = {}
for key in sorted_keys:
  sorted_desserts[key] = desserts[key]

print(sorted_desserts)

# Output
{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

Нека разширим горния блок от код:

  • Инициализирайте sorted_desserts да бъде празен речник на Python.
  • Преминете през списъка с ключове sorted_keys.
  • За всеки ключ в sorted_keys добавете запис към sorted_desserts, като потърсите съответната стойност в речника на десертите.
  Как да се премахна от Dropbox група

Използването на for цикъл като този се счита за многословно. В Python има по-сбита алтернатива, използваща разбиране на речника.

Разбиране на речника в Python

Python поддържа използването на речниково разбиране, подобно на списъчното разбиране. Разбирането на речника ви позволява да създадете нов речник на Python само с един ред код.

▶️ Ето общата конструкция за използване на разбирането на речника в Python.

# 1. when you have both keys and values in two lists: list1, list2
new_dict = {key:value for key,value in zip(list1,list2)}

# 2. when you have the keys, and can look up the values
new_dict = {key:value for key in <iterable>}

Нека използваме втората конструкция в горната клетка: new_dict = {key:value for key in }, за да създадем речник sorted_desserts.

В този пример:

  • итерируем: списъкът sorted_keys
  • ключ: ключът, до който имаме достъп, като преминем през sorted_keys
  • стойност: потърсете стойността, съответстваща на ключа от речника за десерти, десерти[key]

Събирайки всичко заедно, имаме израза за разбиране на речника, както е показано по-долу.

sorted_desserts = {key:desserts[key] for key in sorted_keys}
print(sorted_desserts)

{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

От горния резултат десертите са подредени по азбучен ред в речника sorted_desserts.

Как да сортирате речник на Python по стойност

След това ще научим как да сортираме речник на Python по неговите стойности.

В речника на десертите стойностите отговарят на цените на десертите. Може да искате да сортирате речника по цени, или във възходящ, или в низходящ ред.

▶️ Можете да използвате метода на вградения речник .items(), за да получите всички двойки ключ-стойност. Всеки кортеж е двойка ключ-стойност.

desserts.items()

dict_items([('Ice cream', 10), ('Brownies', 12), ('Cheesecake', 3), 
('Swiss roll', 5), ('Cookies', 4), ('Cup cake', 2)])

Всеки от елементите е кортеж сам по себе си. Така че можете също да индексирате във всяка двойка ключ-стойност за достъп до ключовете и стойностите поотделно.

dict_items = desserts.items()
for item in dict_items:
  print(f"key:{item[0]},value:{item[1]}")

# Output
key:Ice cream,value:10
key:Brownies,value:12
key:Cheesecake,value:3
key:Swiss roll,value:5
key:Cookies,value:4
key:Cup cake,value:2

Тъй като бихме искали да сортираме по стойности, ще използваме горния метод, за да получим стойността при индекс 1 в двойката ключ-стойност.

  8 от най-добрите теми за LXDE

Как да сортирате стойностите на речник на Python във възходящ ред

Този път ще използваме функцията sorted() заедно с незадължителния ключов параметър. ключът може да бъде всяка функция на Python, вградена функция, дефинирана от потребителя функция или дори a ламбда функция.

Забележка: ламбда аргументи: израз е синтаксисът за дефиниране на ламбда функции в Python.

В този пример за сортиране на десерти по цена имаме достъп до елементи от речника (двойки ключ-стойност). Ще зададем ключ = ламбда елемент: елемент[1] тъй като бихме искали да сортираме по стойност (цена).

Тъй като функцията sorted() връща списък по подразбиране, трябва изрично да го прехвърлите в dict, както е показано по-долу.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1]))
print(sorted_desserts)

{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

Можете също да пренапишете, като използвате речниково разбиранекакто беше обсъдено по-рано.

sorted_desserts = {key:value for key, value in sorted(desserts.items(), 
key=lambda item:item[1])}

print(sorted_desserts)

# Output
{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

В sorted_desserts тортата Cup Cake на цена от $2 е първият артикул, а Brownies на цена от $12 е последният артикул.

Как да сортирате стойностите на речник на Python в низходящ ред

Ако искате да сортирате цените в низходящ ред, можете да зададете незадължителния обратен параметър на True, както е обяснено по-долу.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1], 
reverse=True))
print(sorted_desserts)

# Output
{'Brownies': 12, 'Ice cream': 10, 'Swiss roll': 5, 'Cookies': 4, 
'Cheesecake': 3, 'Cup cake': 2}

Сега sorted_desserts е сортиран в низходящ ред на цените, започвайки с най-скъпия десерт Brownies, струващ $12.

Приключване 👩🏽‍💻

Нека набързо обобщим всичко, което научихме в този урок.

  • Речникът на Python съхранява данни в двойки ключ-стойност; всички ключове трябва да са уникални.
  • В процеса на сортиране на речник по ключ или стойност, ние създаваме нов речник, който се сортира според нуждите.
  • Можете да използвате методите на вградения речник, .keys() и .items(), за да извлечете съответно всички ключове и двойки ключ-стойност.
  • Можете да използвате функцията sorted() заедно с незадължителния ключ за параметри и обратно, за да постигнете желаното сортиране.

Сега, след като научихте как да сортирате речник на Python, научете се да сортирате списъци на Python. Приятно кодиране!🎉