как создать пользовательскую функцию для сортировки словаря без [duplicate]

Простой способ протестировать ваше приложение с низким / плохим соединением в эмуляторе:

Go Run> Запустите конфигурацию, выберите приложение Android и перейдите на вкладку Target. Посмотрите параметры запуска эмулятора. Здесь вы можете легко изменить скорость сети и сетевую задержку.

629
задан MERose 1 May 2015 в 22:57
поделиться

23 ответа

Стандартные словари Python неупорядочены. Даже если вы отсортировали пары (ключ, значение), вы не смогли бы сохранить их в файле dict таким образом, чтобы сохранить порядок.

Самый простой способ - использовать OrderedDict , который запоминает порядок, в котором были вставлены элементы:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

Не обращайте внимания на то, как напечатан od; он будет работать как ожидалось:

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Для пользователей Python 3 необходимо использовать .items() вместо .iteritems():

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
709
ответ дан kame 15 August 2018 в 23:33
поделиться
  • 1
    Спасибо, я использую python 2.6.5, а OrderedDict - для 2.7 и выше, поэтому он не работает. – achrysochoou 25 January 2012 в 13:10
  • 2
    Я использовал это, и он работает, я думаю, его больше кода и избыточности, но выполняет свою работу, # неупорядоченный dict d = {2: 3, 1:89, 4: 5, 3: 0} упорядоченныйDict = {} для ключа в отсортированном (d.iterkeys ()): orderedDict [key] = d [key] – achrysochoou 25 January 2012 в 13:20
  • 3
    @achrysochoou: тогда вы должны использовать рецепт OrderedDict , связанный в документации python, он отлично работает для старого python – Cédric Julien 25 January 2012 в 13:20
  • 4
    @achrysochoou: если бы это сработало, это, должно быть, было просто удачей. Как вам сказали, в обычных словарях нет понятия сортировки, независимо от того, назначили ли вы отсортированные или случайные ключи. – Ricardo Cárdenes 25 January 2012 в 13:25
  • 5
    Спасибо всем за вашу помощь, я прочитаю предлагаемую документацию и попытаюсь следовать правильной методологии. Ура! – achrysochoou 25 January 2012 в 13:32

Здесь я нашел простейшее решение для сортировки ключа python с помощью клавиши pprint. например.

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

, но при использовании pprint он вернет отсортированный dict

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}
8
ответ дан Atul Arvind 15 August 2018 в 23:33
поделиться

Как отмечали другие, словари по своей сути неупорядочены. Однако, если проблема заключается в просто отображении словарей упорядоченным способом, вы можете переопределить метод __str__ в подклассе словаря и использовать этот словарь, а не встроенный dict. Например,

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

Обратите внимание, что это ничего не меняет о том, как хранятся ключи, порядок их возврата, когда вы перебираете их и т. Д., Только как они отображаются с print или на консоль python.

21
ответ дан Brian 15 August 2018 в 23:33
поделиться

Из документации библиотеки collections Python :

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
170
ответ дан Dennis 15 August 2018 в 23:33
поделиться
  • 1
    здорово! Ребята, если вы хотите изменить порядок (по убыванию), вы просто добавляете reverse=True, например. OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0])) – gudthing 28 August 2016 в 20:03
  • 2
    В PyCharm, независимо от того, какой словарь я использую, я всегда получаю это предупреждение: Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]]) – Euler_Salter 24 July 2018 в 10:00

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

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
22
ответ дан Dipu 15 August 2018 в 23:33
поделиться
  • 1
    К сожалению, этот трюк не всегда работает. Например, d = {22:3, -1111:89, 44444444444:5, 3333:0} и d = {"f2":3, "a1":89, "z4":5, "m3":0}. Обратите внимание, что документация python говорит . Лучше всего думать о словаре как неупорядоченном наборе ключей . – olibre 18 April 2018 в 07:07
  • 2
    Я не вижу твоей точки. Вопрос просил сортировать по ключам. И мой код дает правильный ответ для обоих ваших примеров. Для первого случая: d = {-1111: 89, 22: 3, 3333: 0, 44444444444: 5}, а для второго: d = {'a1': 89, 'f2': 3, 'm3': 0, 'z4': 5}. Я думаю, что оба они законно отсортированы по ключам. – Dipu 15 July 2018 в 07:19

В Python 3.

>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
    print (key, D1[key])

дает

1 89
2 3
3 0
4 5
12
ответ дан Evgeny Tryastsin 15 August 2018 в 23:33
поделиться

Существует ряд модулей Python, которые предоставляют реализации словаря, которые автоматически поддерживают ключи в отсортированном порядке. Рассмотрим модуль sortedcontainers , который является реализацией pure-Python и fast-as-C. Существует также сравнение производительности с другими популярными опциями, сравниваемыми друг с другом.

Использование упорядоченного dict - это неадекватное решение, если вам нужно постоянно добавлять и удалять пары ключ / значение, в то время как также итерация.

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

Тип SortedDict также поддерживает индексированные определения местоположения и удаление, что невозможно во встроенном типе dict.

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
31
ответ дан GrantJ 15 August 2018 в 23:33
поделиться
  • 1
    +1 для адресации в случае использования упорядоченного порядка и связывания пакетов, которые делают это – mgk 18 April 2014 в 18:14

Словарь Python был неупорядочен перед Python 3.6. В CPython реализации Python 3.6 словарь сохраняет порядок вставки. Из Python 3.7 это станет языковой функцией.

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

test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}

def dict_reorder(item):
    return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}

reordered_dict = dict_reorder(test_dict)

https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb

4
ответ дан Guangyang Li 15 August 2018 в 23:33
поделиться

Если у вас есть dict, например:

not_ordered_dict = {5 : "5555", 9 : "9999", 1 : "1111"}

ordered_dict = {}

for key in sorted(not_ordered_dict):
    ordered_dict[key] = not_ordered_dict[key]   
-7
ответ дан James Wood 15 August 2018 в 23:33
поделиться
  • 1
    Словарь не может быть заказан. Ваш & quot; заказ & quot; dict будет точно так же, как неупорядоченный. Проведите тест и убедитесь сами. – zondo 17 May 2016 в 11:04

Генерирует именно то, что вы хотите:

 D1 = {2:3, 1:89, 4:5, 3:0}

 sort_dic = {}

 for i in sorted(D1):
     sort_dic.update({i:D1[i]})
 print sort_dic


{1: 89, 2: 3, 3: 0, 4: 5}

Но это не способ записи для этого, потому что он может показать отличное поведение с разными словарями, которые я недавно узнал. Поэтому в ответ на мой запрос, который я разделяю здесь, был предложен прекрасный путь.

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))
3
ответ дан jax 15 August 2018 в 23:33
поделиться

Сравнение времени двух методов из 2.7 показывает, что они практически идентичны:

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 
0
ответ дан Jesuisme 15 August 2018 в 23:33
поделиться

Я думаю, что проще всего отсортировать ключ dict и сохранить отсортированную пару: значение в новом dict.

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be neccessary
        dict2[key] = dict1[key]

Чтобы сделать его более понятным:

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted     values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be  neccessary
        value = dict1[key]
        dict2[key] = value
3
ответ дан lallolu 15 August 2018 в 23:33
поделиться
dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}

temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])

sorted_dict:
         {1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}
0
ответ дан Mahdi Ghelichi 15 August 2018 в 23:33
поделиться
from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
    {'fname': 'Mo', 'lname': 'Mahjoub'},
    {'fname': 'Abdo', 'lname': 'Al-hebashi'},
    {'fname': 'Ali', 'lname': 'Muhammad'}
]
#  This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. 
for k in sorted (user, key=itemgetter ('fname', 'lname')):
    print (k)

# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
    print (x)
0
ответ дан Mohammad Mahjoub 15 August 2018 в 23:33
поделиться

В самих словарях нет упорядоченных элементов как таковых, если вы хотите напечатать их и т. д. в некотором порядке, вот несколько примеров:

В Python 2.4 и выше:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

дает:

alan: 2
bob: 1
carl: 40
danny: 3

(Python ниже 2.4:)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

Источник: http://www.saltycrane.com/blog/2007/09 / как к своему роду-питон-словарь по-ключам /

344
ответ дан Nils von Barth 15 August 2018 в 23:33
поделиться
  • 1
    Вы также можете использовать OrderedDict в python 2.4+, как в ответе NPE – radtek 29 January 2015 в 23:09

Вы можете создать новый словарь, отсортировав текущий словарь по ключевым словам в соответствии с вашим вопросом.

Это ваш словарь

d = {2:3, 1:89, 4:5, 3:0}

Создайте новый словарь d1, отсортировав его d с использованием лямбда-функции

d1 = dict(sorted(d.items(), key = lambda x:x[0]))

d1 должно быть {1: 89, 2: 3, 3: 0, 4: 5}, отсортировано по клавишам в d.

2
ответ дан Pang 15 August 2018 в 23:33
поделиться

Python dicts не упорядочены. Обычно это не проблема, поскольку наиболее распространенным вариантом использования является поиск.

Самый простой способ сделать то, что вы хотите, - создать collections.OrderedDict вставку элементов в отсортированном порядке.

ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])

Если вам нужно повторить, как и другие выше, предположил, самым простым способом было бы перебрать отсортированные ключи. Примеры -

Значения печати, отсортированные по ключам:

# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
    value = d[k]
    # do something with k, value like print
    print k, value

Получить список значений, отсортированных по клавишам:

values = [d[k] for k in sorted(d.keys())]
4
ответ дан Ramashish Baranwal 15 August 2018 в 23:33
поделиться
  • 1
    for k,value in sorted(d.items()): лучше: избегать доступа к dict по ключу снова в цикле – Jean-François Fabre 27 April 2018 в 19:38

Самое простое решение состоит в том, что вы должны получить список ключей dict, отсортированный по порядку, а затем итерацию по dict. Например,

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print r, a1[r]

Следующим будет вывод (порядок ожидания)

e 30
b 13
d 4
c 2
a 1
0
ответ дан Shafiq 15 August 2018 в 23:33
поделиться

Существует простой способ сортировки словаря.

В соответствии с вашим вопросом,

Решение:

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y

(Где c, это имя вашего словаря.)

Эта программа дает следующий результат:

[(1, 89), (2, 3), (3, 0), (4, 5)]

, как и вы хотели.

Другой пример:

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x

Дает выход: ['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y

Дает выход: [18, 24, 32, 36, 41]

z=sorted(d.items())
print z

Дает выход:

[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]

Следовательно, изменяя его на клавиши, значения и элементы, вы можете печатать так, как хотите. Надеюсь, это поможет!

5
ответ дан Sree 15 August 2018 в 23:33
поделиться

Ребята, вы делаете все сложнее ... это очень просто

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)

Выход:

{'A':2,'B':1,'C':3}
0
ответ дан Tempux 15 August 2018 в 23:33
поделиться
  • 1
    Приобретено, потому что я не знал, что для определения их типов используются словарные имена, но ОП действительно спрашивал о & quot; going & quot; от unsorted до отсортированного dict, то есть OP, похоже, хочет что-то, что остается отсортированным в памяти, возможно, для некоторого алгоритма, который требует отсортированных ключей – Captain Lepton 8 December 2016 в 17:13
  • 2
    Этот метод не позволяет назначать цепочку, поскольку pprint не возвращает ни одного. & GT; & GT; & GT; adict = {'B': 1, 'A': 2, 'C': 3} & gt; & gt; & gt; & gt; & gt; ppdict = pprint (adict) {'A': 2, 'B': 1, 'C': 3} & gt; & gt; gt; ppdict.type () Traceback (последний последний вызов): File & quot; & lt; stdin & gt ;, строка 1, в & lt; module & gt; AttributeError: объект 'NoneType' не имеет атрибута 'type' – user 8 December 2016 в 20:02

Найден другой способ:

import json
print json.dumps(d, sort_keys = True)

upd: 1. это также сортирует вложенные объекты (спасибо @DanielF). 2. Словари python неупорядочены, поэтому это можно использовать для печати или назначать только str.

14
ответ дан tschesseket 15 August 2018 в 23:33
поделиться
  • 1
    Но это также сортирует ключи вложенных объектов, которые могут не понадобиться. – Daniel F 17 July 2015 в 21:08
  • 2
    @DanielF Я обновил ответ, спасибо. – tschesseket 24 May 2016 в 00:27
  • 3
    Обратите внимание, что это только сортировочные словари, а не списки, например. dict.keys () не будет сортироваться, потому что это список. – Andrew 18 August 2017 в 20:08

Просто:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

Выход:

1 89
2 3
3 0
4 5
24
ответ дан user3769249 15 August 2018 в 23:33
поделиться
  • 1
    sd - список кортежей, а не словарь. (все еще полезно.) – nischi 24 November 2016 в 10:53
l = dict.keys()
l2 = l
l2.append(0)
l3 = []
for repeater in range(0, len(l)):
    smallnum = float("inf")
    for listitem in l2:
        if listitem < smallnum:
            smallnum = listitem
    l2.remove(smallnum)
    l3.append(smallnum)
l3.remove(0)
l = l3

for listitem in l:
    print(listitem)
-2
ответ дан user7070507 15 August 2018 в 23:33
поделиться
  • 1
    Есть еще 14 ответов. Можете ли вы немного объяснить свой код и почему это может быть лучше, чем другие решения? – FelixSFD 25 October 2016 в 15:53
  • 2
    Downvoted - Довольно нечитаемый код с короткими бессмысленными именами переменных l, l2, l3. Кажется, это попытка косвенного и неэффективного алгоритма без знания стандартных функций python и в любом случае не работает при тестировании на небольшом примере в оригинальной записи. – Captain Lepton 8 December 2016 в 17:17
Другие вопросы по тегам:

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