Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2013 15:01:39

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Есть словарь такого вида:

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

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

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

Дело в том, что <что-то> всегда разное.



—-
memento mori

Отредактировано k0st1an (Фев. 7, 2013 15:18:33)

Офлайн

#2 Фев. 7, 2013 15:18:44

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Сортировка по ключу?



Офлайн

#3 Фев. 7, 2013 15:19:56

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Исправил пост, не заметил что код был съеден парсером.



—-
memento mori

Офлайн

#4 Фев. 7, 2013 15:30:39

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Т.е. сортировка должна быть по одному из значений словаря.
А что должно быть в отсортированном объекте - ключи (или пары: ключ-значение)?



Офлайн

#5 Фев. 7, 2013 15:41:04

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Тот же объект, что и сортируется, только в отсортированном виде - сортировка по ключу. выход должен быть такой (новый объект - rr2):

test2
test1


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

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

как-то так.



—-
memento mori

Офлайн

#6 Фев. 7, 2013 16:13:57

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

На скорую руку…

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

На самом деле вариантов масса :)



Отредактировано 4kpt (Фев. 7, 2013 16:24:20)

Офлайн

#7 Фев. 7, 2013 18:11:25

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Спасибо, буду разбираться как это работает )))
Не люблю тупо копипастить ))



—-
memento mori

Офлайн

#8 Фев. 7, 2013 20:39:30

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Хорошо с пояснениями:

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



Отредактировано 4kpt (Фев. 7, 2013 20:40:19)

Офлайн

#9 Фев. 7, 2013 23:31:39

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

Посмотрел. Да формируется список, но данные во вложенном словаре теряются. Нельзя обратится так:

result['test2']['x']

Мне то как раз и хотелось данные эти выводить. Я конечно смогу написать функцию по сортировке. Но на данный момент уровень знаний python не так высок и это получится громоздкая конструкция. Нутром чую, что можно сделать красивее. Спасибо и на этом



—-
memento mori

Офлайн

#10 Фев. 8, 2013 00:30:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря (+ вложенный словарь)

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



Отредактировано py.user.next (Фев. 8, 2013 00:32:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version