Как отсортировать словарь по значению?

Один вариант - использовать str, а затем to_datetime (или аналогичный):

In [11]: str(dt64)
Out[11]: '2012-05-01T01:00:00.000000+0100'

In [12]: pd.to_datetime(str(dt64))
Out[12]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

Примечание: он не равен dt, потому что он становится "offset-aware" :

In [13]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[13]: datetime.datetime(2012, 5, 1, 1, 0)

Это кажется неэлегантным.

.

Обновление: это может касаться «неприятный пример»:

In [21]: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

In [22]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[22]: datetime.datetime(2002, 6, 28, 1, 0)

3426
задан Anvesh 20 March 2019 в 22:50
поделиться

7 ответов

Не возможно отсортировать словарь, только получить представление словаря, который отсортирован. Словари являются по сути беспорядочными, но другими типами, такими как списки и кортежи, не. Таким образом, Вам нужен заказанный тип данных для представления отсортированных значений, которые будут list—, вероятно, список кортежей.

, Например,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x будет список кортежей, отсортированных по второму элементу в каждом кортеже. dict(sorted_x) == x.

И для тех, которые желают отсортировать на ключах вместо значений:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

В Python3, так как распаковка не позволяется [1] , мы можем использовать

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

, Если Вы хотите вывод как dict, можно использовать collections.OrderedDict :

import collections

sorted_dict = collections.OrderedDict(sorted_x)
4361
ответ дан Peter Sobhi 21 March 2019 в 08:50
поделиться

Можно создать "инвертированный индекс", также

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

Теперь инверсия имеет значения; каждое значение имеет список применимых ключей.

for k in sorted(inverse):
    print k, inverse[k]
21
ответ дан S.Lott 21 March 2019 в 08:50
поделиться
  • 1
    Я должен был выполнить решение от @Andreyco вместо шага 2. – bergie3000 7 July 2013 в 06:06

Dicts не может быть отсортирован, но можно создать отсортированный список от них.

А отсортировал список значений dict:

sorted(d.values())

список А (ключ, значение) пары, отсортированные по значению:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))
206
ответ дан Roberto Bonvallet 21 March 2019 в 08:50
поделиться
  • 1
    Вы - верный arr+11, приводит к неопределенному поведению? У меня создалось впечатление, что это только произошло, когда Вы пытались разыменовать недопустимый указатель. – Martin York 16 November 2008 в 18:15

В значительной степени то же как ответ Hank Gay :

sorted([(value,key) for (key,value) in mydict.items()])

Или оптимизированный немного, как предложил John Fouhy:

sorted((value,key) for (key,value) in mydict.items())
74
ответ дан Justin Batch 21 March 2019 в 08:50
поделиться

Вы можете использовать:

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

Это отсортирует словарь по значениям каждой записи в словаре от наименьшего к наибольшему.

Чтобы отсортировать его в порядке убывания, просто добавьте reverse = True :

sorted(d.items(), key=lambda x: x[1], reverse=True)
780
ответ дан 17 December 2019 в 16:00
поделиться

Это просто: sorted (dict1, key = dict1 .get)

Ну, вообще-то возможно «отсортировать по словарным значениям». Недавно мне пришлось сделать это в Code Golf (вопрос о переполнении стека Code golf: частотная диаграмма слов ). В сокращенном виде проблема была такого рода: учитывая текст, посчитайте, как часто встречается каждое слово, и выведите список самых популярных слов, отсортированных по убыванию частоты.

Если вы построите словарь со словами в качестве ключей и количеством вхождений каждого слова в качестве значения, упрощенного здесь как:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

, то вы можете получить список слов, упорядоченный по частоте использования с sorted (d, key = d.get) - сортировка выполняется по ключам словаря, используя количество вхождений слова в качестве ключа сортировки.

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

Я пишу это подробное объяснение, чтобы проиллюстрировать, что люди часто имеют в виду, говоря «Я могу легко отсортировать словарь по ключу, но как мне отсортировать по значению» - и я думаю, что OP пытался решить такую ​​проблему. И решение состоит в том, чтобы составить своего рода список ключей на основе значений, как показано выше.

1170
ответ дан 17 December 2019 в 16:00
поделиться

В последней версии Python 2.7 у нас есть новый тип OrderedDict , который запоминает порядок, в котором были добавлены элементы.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

Чтобы создать новый упорядоченный словарь из исходного, сортировка по значениям:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

OrderedDict ведет себя как обычный dict:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])
157
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: