Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2018 11:01:36

na9ort
Зарегистрирован: 2018-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

Здравствуйте.

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

defaultdict(<class 'str'>, {'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '), 
'c_file2.txt': ('2', '16 bytes Fri Sep 28 16:55:13 2018 '),
'b_file3.txt': ('3', '15 bytes Fri Sep 28 16:08:06 2018 ')})

Нужно отсортировать словарь по первому элементу в значении. То есть вот по этим: “1”, “2”, “3”.
Я понимаю, что нужно задать параметр ключа в функции sorted(), но написать функцию, возвращающую нужное значение, для подстановки в key не получается. Подскажите пожалуйста.

И ещё вопрос. К словарю ведь нельзя обращаться по цифровым индексам типа
myDict[0][1][2]
, только ведь через наименование ключа?

Отредактировано na9ort (Окт. 1, 2018 11:03:36)

Офлайн

#2 Окт. 1, 2018 12:10:03

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

Попробуйте так:

 new_myDict = sorted(myDict.items(), key=lambda x: x[1])

Офлайн

#3 Окт. 1, 2018 12:10:09

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

 >>> dct = {
	'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '), 
         'b_file3.txt': ('3', '15 bytes  Fri Sep 28 16:08:06 2018 '),
	 'c_file2.txt': ('2', '16 bytes  Fri Sep 28 16:55:13 2018 ')
	}
>>> dct = dict(sorted(dct.items() ,key = lambda x : x[0]))
>>> print(dct)
{'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '), 'b_file3.txt': ('3', '15 bytes  Fri Sep 28 16:08:06 2018 '), 'c_file2.txt': ('2', '16 bytes  Fri Sep 28 16:55:13 2018 ')}
>>>

Отредактировано marvellik (Окт. 1, 2018 12:10:53)

Офлайн

#4 Окт. 1, 2018 12:11:04

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

na9ort
К словарю ведь нельзя обращаться по цифровым индексам типа
Легко можно, если ключ словаря - число.
na9ort
Нужно отсортировать словарь по первому элементу в значении.
Словарь сортировать вообще бессмысленно, вам нужна другуя структура, которая будет содержать отсортированное значение.
na9ort
не получается

 d = {'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '),
     'c_file2.txt': ('2', '16 bytes  Fri Sep 28 16:55:13 2018 '),
     'b_file3.txt': ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')}
s = sorted(d.items(), key=lambda x: int(x[1][0]))
print(s)

Офлайн

#5 Окт. 1, 2018 12:27:16

na9ort
Зарегистрирован: 2018-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

rami
new_myDict = sorted(myDict.items(), key=lambda x: x)

Хм…интересно. Если использовать лямбда-функции, то индексация элементов идёт сплошной нумерацией, если написать отдельную функцию, то относительной.

То есть для лямбда-функции значение элемента “1” имеет индекс 1, “a_file1.txt” - индекс 0, “17 bytes Fri Sep 28 16:55:08 2018 ” - индекс 2.

Для отдельной функции:
 def sortedValue(item):
      return item[0]

элемент “1” имеет индекс 0.

Спасибо. Всё получилось.

Отредактировано na9ort (Окт. 1, 2018 12:27:25)

Офлайн

#6 Окт. 1, 2018 12:29:13

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

na9ort
Хм…интересно. Если использовать лямбда-функции, то индексация элементов идёт сплошной нумерацией, если написать отдельную функцию, то относительной.

То есть для лямбда-функции значение элемента “1” имеет индекс 1, “a_file1.txt” - индекс 0, “17 bytes Fri Sep 28 16:55:08 2018 ” - индекс 2.

Для отдельной функции:

ЧЕГО???

Офлайн

#7 Окт. 1, 2018 12:37:01

na9ort
Зарегистрирован: 2018-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

Papa_Svin
Легко можно, если ключ словаря - число.
Имелся виду случай при ключе типа str. Со значениями не числами.

Papa_Svin
Словарь сортировать вообще бессмысленно.
Словарь это неупорядоченная структура. Я знаю. Мне сортировка для вывода нужна.

Papa_Svin
ЧЕГО???
Ещё раз. Через лямбда-функцию делается так:
key = lambda x: x[1]
Индекс имеет значение “1”.

Через функцию:
 def sortedValue(item):
return item[0]
Функция возвращает значение с индексом “0”.
Элемент словаря то один и тот же, но нумерация индекса отличается.
Ну может я чего не понимаю, только начал изучать питон. Но вроде всё правильно.

Единственно могу сказать, что Ваш вариант:
lambda x: int(x[1][0])
пока самый очевидный. В связке ключ-значение, у второй части элемента(список значений) словаря взять первое значение из списка.

Офлайн

#8 Окт. 1, 2018 12:45:31

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

na9ort
Элемент словаря то один и тот же, но нумерация индекса отличается.
Друг, НЕТ НИКАКОЙ РАЗНИЦЫ лямбду ты используешь или нелямбду. Покажи оба примера. Потому что ты просто говоришь глупости.

 d = {'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '),
     'c_file2.txt': ('2', '16 bytes  Fri Sep 28 16:55:13 2018 '),
     'b_file3.txt': ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')}
  
s = sorted(d.items(), key=lambda x: int(x[1][0]))
print(s)
  
def keyfunc(item):
    return int(item[1][0])
  
print(sorted(d.items(), key=keyfunc))

Офлайн

#9 Окт. 1, 2018 12:55:10

na9ort
Зарегистрирован: 2018-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

Papa_Svin
НЕТ НИКАКОЙ РАЗНИЦЫ
А ну да, мой косяк. Прошу прощения.

Попробовал сделать так, как я описал. Не работает оно так. Разницы действительно нет.
Спасибо, что помогли разобраться.

 >>> d = {'a_file1.txt': ('1', '17 bytes  Fri Sep 28 16:55:08 2018 '),
     'c_file2.txt': ('2', '16 bytes  Fri Sep 28 16:55:13 2018 '),
     'b_file3.txt': ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')}
>>> def keyFunc(item):
	return item[0]
>>> for key, value in sorted(d.items(), key = lambda x: x[1]):
	print(key, value)
	
a_file1.txt ('1', '17 bytes  Fri Sep 28 16:55:08 2018 ')
c_file2.txt ('2', '16 bytes  Fri Sep 28 16:55:13 2018 ')
b_file3.txt ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')
>>> for key, value in sorted(d.items(), key = keyFunc):
	print(key, value)
	
a_file1.txt ('1', '17 bytes  Fri Sep 28 16:55:08 2018 ')
b_file3.txt ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')
c_file2.txt ('2', '16 bytes  Fri Sep 28 16:55:13 2018 ')
>>> def keyFunc(item):
	return item[1]
>>> for key, value in sorted(d.items(), key = keyFunc):
	print(key, value)
	
a_file1.txt ('1', '17 bytes  Fri Sep 28 16:55:08 2018 ')
c_file2.txt ('2', '16 bytes  Fri Sep 28 16:55:13 2018 ')
b_file3.txt ('3', '15 bytes  Fri Sep 28 16:08:06 2018 ')
>>> 

Офлайн

#10 Окт. 1, 2018 13:00:27

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Сортировка словаря по элементу в значении

Если нужно сортировать как числа, использовать как предложил Papa_Svin:

 key=lambda x: int(x[1][0])

а если как строки:
 key=lambda x: x[1]

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version