Найти - Пользователи
Полная версия: Сортировка словаря (+ вложенный словарь)
Начало » Python для новичков » Сортировка словаря (+ вложенный словарь)
1 2 3
k0st1an
Есть словарь такого вида:

>>> rr
{'test1': {'x': 12, 'y': 20}, 'test2': {'x': 11, 'y': 22}}

Мне надо сделать сортировку по

rr[<что-то>]['x']

Дело в том, что <что-то> всегда разное.
4kpt
Сортировка по ключу?
k0st1an
Исправил пост, не заметил что код был съеден парсером.
4kpt
Т.е. сортировка должна быть по одному из значений словаря.
А что должно быть в отсортированном объекте - ключи (или пары: ключ-значение)?
k0st1an
Тот же объект, что и сортируется, только в отсортированном виде - сортировка по ключу. выход должен быть такой (новый объект - rr2):

test2
test1


А потом я уже буду его прогонять через for и брать нужные параметры.

for item in rr2:
  print(rr2[item]['x'], rr2[item]['y'])

как-то так.
4kpt
На скорую руку…
rr2 = dict(zip([rr[i]["x"] for i in rr], rr.keys()))
rr3 = [rr2[x] for x in sorted(rr2)]

Или одной строкой…
rr2 = [key[1] for key in sorted([(rr[name]["x"], name) for name in rr])]

Если описать последовательно:
rr = {'test1': {'x': 12, 'y': 20}, 'test2': {'x': 11, 'y': 22}}
x_and_key = []
result = []
for name in rr:
    x_and_key.append((rr[name]["x"], name))
for pos, key in sorted(x_and_key):
    result.append(key)
print result

На самом деле вариантов масса :)
k0st1an
Спасибо, буду разбираться как это работает )))
Не люблю тупо копипастить ))
4kpt
Хорошо с пояснениями:
rr = {'test1': {'x': 12, 'y': 20}, 'test2': {'x': 11, 'y': 22}}
x_and_key = []
result = []
for name in rr: # Перебираем все ключи словаря rr
    # Добавляем в список x_and_key наборы, состоящие из пар:
    # значение по ключу "x" вложенного словаря и ключ основного словаря,
    # которому это значение соответствует...
    x_and_key.append((rr[name]["x"], name)) 
for pos, key in sorted(x_and_key): # Сортирую полученный список по первым элементам вложенных кортежей...
    # и  формирую список, состоящий из ключей основного словаря.
    result.append(key)
print result
k0st1an
Посмотрел. Да формируется список, но данные во вложенном словаре теряются. Нельзя обратится так:

result['test2']['x']

Мне то как раз и хотелось данные эти выводить. Я конечно смогу написать функцию по сортировке. Но на данный момент уровень знаний python не так высок и это получится громоздкая конструкция. Нутром чую, что можно сделать красивее. Спасибо и на этом
py.user.next
>>> d = {'test1': {'x': 12, 'y': 20}, 'test2': {'x': 11, 'y': 22}}
>>> for k in sorted(d, key=lambda i: int(i[-1]), reverse=True):
...     print(k, '->', d[k])
... 
test2 -> {'x': 11, 'y': 22}
test1 -> {'x': 12, 'y': 20}
>>>

более точное
>>> import re
>>> 
>>> d = {'test11': {'x': 12, 'y': 20}, 'test2': {'x': 11, 'y': 22}}
>>> 
>>> f = lambda s: int(re.search(r'\d+$', s).group(0))
>>> 
>>> for k in sorted(d, key=f):
...     print(k, '->', d[k])
... 
test2 -> {'x': 11, 'y': 22}
test11 -> {'x': 12, 'y': 20}
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB