питон: произвольный порядок - PullRequest
3 голосов
/ 23 марта 2009

В Oracle SQL есть функция для заказа следующим образом:

order by decode("carrot" = 2
               ,"banana" = 1
               ,"apple" = 3)

Каков наилучший способ реализовать это в Python?

Я хочу иметь возможность заказать дикт по его ключам. И этот порядок не обязательно в алфавитном порядке или что-нибудь - я определяю порядок.

Ответы [ 6 ]

15 голосов
/ 23 марта 2009

Используйте key именованный аргумент ключевого слова sorted().

#set up the order you want the keys to appear here
order = ["banana", "carrot", "apple"]

# this uses the order list to sort the actual keys.
sorted(keys, key=order.index)

Для более высокой производительности, чем list.index, вы можете использовать dict.get вместо.

#this builds a dictionary to lookup the desired ordering
order = dict((key, idx) for idx, key in enumerate(["banana", "carrot", "apple"]))

# this uses the order dict to sort the actual keys.
sorted(keys, key=order.get)
4 голосов
/ 23 марта 2009

Вы не можете заказать dict как таковой, но вы можете преобразовать его в список кортежей (ключ, значение), и вы можете отсортировать его.

Для этого вы используете метод .items (). Например,

>>> {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
>>> {'a': 1, 'b': 2}.items()
[('a', 1), ('b', 2)]

Самый эффективный способ сортировки - использование ключевой функции. Использование cmp менее эффективно, потому что его нужно вызывать для каждой пары элементов, тогда как при использовании ключа его нужно вызывать только один раз для каждого элемента. Просто укажите вызываемый элемент, который преобразует элемент в соответствии с тем, как он должен быть отсортирован:

sorted(somedict.items(), key=lambda x: {'carrot': 2, 'banana': 1, 'apple':3}[x[0]])

Вышеприведенный код определяет dict, который определяет пользовательский порядок ключей, которые вы хотите, и лямбда-выражение возвращает это значение для каждого ключа в старом dict.

1 голос
/ 23 марта 2009

В новых версиях Python будет OrderedDict: http://www.python.org/dev/peps/pep-0372/.

Тем временем вы можете попробовать одну из альтернативных реализаций: http://code.activestate.com/recipes/496761/, Упорядоченный словарь .

1 голос
/ 23 марта 2009

Вы не можете отсортировать словарь; словарь - это отображение, а отображение не имеет порядка.

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

keys = myDict.keys()
sorted_keys = sorted(keys, myCompare)
1 голос
/ 23 марта 2009

Диктофон Python является хэш-картой, поэтому он не имеет порядка. Но вы можете сортировать ключи отдельно, извлекая их из словаря с помощью метода keys () .

sorted() принимает в качестве аргументов функции сравнения и ключевые функции.

Вы можете сделать точную копию вашего декодирования с помощью

sortedKeys = sorted(dictionary, {"carrot": 2
                                ,"banana": 1
                                ,"apple":  3}.get);
0 голосов
/ 23 марта 2009

Диктовка не заказана. Вам нужно будет сохранить список ключей.

Вы можете передать свою собственную функцию сравнения в list.sort () или sorted ().

Если вам нужно отсортировать по нескольким ключам, просто объедините их в кортеж и отсортируйте по кортежу.

...