Методы сортировки словаря - PullRequest
3 голосов
/ 15 февраля 2012

Я имею в виду вопрос: https://stackoverflow.com/a/575889/292291

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

    >>> dict = { 2: "list 2", 0: "list 0", 1: "list 1" }
    >>> dict
    {0: 'list 0', 1: 'list 1', 2: 'list 2'}
    
  2. В sorted(mydict, key=lambda key: mydict[key]) как мне интерпретировать или читать лямбду? Я не понимаю эту часть, так как я новичок в лямбдах. Что означают key: и mydict[key]?

  3. В sorted(d, key=d.get) что означает d.get? Если я сделаю:

    >>> dict.get
    <built-in method get of dict object at 0x1d27830>
    

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

1- Dicts никогда не гарантируют заказ, иногда он может даже выглядеть так, как есть, но наберите там достаточно цифр, и вы увидите, что они этого не делают (это из-за способа, которым хэширует получены для каждого ключа)

2- Эти два одинаковы:

lambda key: mydict[key]

def temp_function(key):
    return mydict[key]

По сути, вы создаете временную функцию, которая получает ключ в качестве параметра и возвращает mydict [ключ]

3- Второй аргумент sorted относится к функции, которая будет вызываться, передавая текущий ключ dict. Значение, возвращаемое этим, будет использоваться для определения порядка сортировки вашего слова.

4 голосов
/ 15 февраля 2012
  1. Нет. Словари упорядочены по хешу их ключей, и нет никакой гарантии, что алгоритм хеширования не изменится между версиями или реализациями.

  2. Все между lambda и : является аргументами. Все после : является возвращаемым выражением.

  3. Метод get объекта, связанного с d. В dict объектах он возвращает значение, если ключ существует, в противном случае передается значение по умолчанию или None.

3 голосов
/ 15 февраля 2012

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

1) Я не верю в это. Если вы хотите отсортировать dict, просто используйте модуль OrderedDict из collections.

2) Вы должны прочитать ее как анонимную функцию, которая при входном аргументе key вернет объект mydict[key]. Это будет эквивалентно:

def foo(key):
  # assume mydict is in scope
  return mydict[key]

3) Предполагая, что ваша переменная d здесь является диктом, она вернет список ключей в словаре, отсортированный по соответствующим им значениям из d. Это означает, что функция d.get() вызывается для любого значения, равного in d при итерации, и список будет отсортирован по возвращаемым значениям d.get, а не по самим объектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...