Предположим, у меня есть диктофон.
data = {1:'b', 2:'a'}
И я хочу отсортировать данные по 'b' и 'a', чтобы получить результат
'a','b'
Как мне это сделать?
Есть идеи?
Предположим, у меня есть диктофон.
data = {1:'b', 2:'a'}
И я хочу отсортировать данные по 'b' и 'a', чтобы получить результат
'a','b'
Как мне это сделать?
Есть идеи?
Вы можете создать отсортированный список из значений и перестроить словарь:
myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"}
newDictionary={}
sortedList=sorted(myDictionary.values())
for sortedKey in sortedList:
for key, value in myDictionary.items():
if value==sortedKey:
newDictionary[key]=value
Вывод: newDictionary = {'one': '1', 'two': '2', '1four': '4', 'five': '5'}
без лямбда-метода
# sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
for k, v in d.items():
if v == i:
return (k)
sortvaluelist = sorted(d.values())
sortresult ={}
for i1 in sortvaluelist:
key = getkeybyvalue(d,i1)
sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')
В своем комментарии к Джону вы предлагаете ключи и значения словаря, а не только значения.
PEP 256 предлагает это для сортировки словаря по значениям.
import operator
sorted(d.iteritems(), key=operator.itemgetter(1))
Если вы хотите упорядочить по убыванию, сделайте это
sorted(d.iteritems(), key=itemgetter(1), reverse=True)
Спасибо за все ответы. Вы все мои герои ;-)
Сделал в итоге что-то вроде этого:
d = sorted(data, key = data.get)
for key in d:
text = data[key]
Из вашего комментария к ответу gnibbler, я бы сказал, что вам нужен список пар ключ-значение, отсортированный по значению:
sorted(data.items(), key=lambda x:x[1])
Если вы действительно хотите отсортировать словарь, а не просто получить отсортированный список, используйте collections.OrderedDict
>>> from collections import OrderedDict
>>> from operator import itemgetter
>>> data = {1: 'b', 2: 'a'}
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1)))
>>> d
OrderedDict([(2, 'a'), (1, 'b')])
>>> d.values()
['a', 'b']
Печально то, что в Python 2.6.5 ... он не поддерживает OrderedDict
@kingRauk, тогда не помечайте свой вопрос Python 2.7 .... Также многие вещи, которые вы упомянули в комментариях, должны были быть в вашем вопросе с самого начала
Да, извините за это ...
@kingRauk Никаких проблем, все хорошо
Я также думаю, что важно отметить, что тип объекта Python dict
представляет собой хеш-таблицу (подробнее об этом здесь), и поэтому его нельзя сортировать без преобразования его ключей / значений в списки. Это позволяет получить dict
элемент за постоянное время O(1)
, независимо от размера / количества элементов в словаре.
Сказав это, после того, как вы отсортируете его ключи - sorted(data.keys())
или значения - sorted(data.values())
, вы сможете затем использовать этот список для доступа к ключам / значениям в шаблонах проектирования, таких как эти:
for sortedKey in sorted(dictionary):
print dictionary[sortedKeY] # gives the values sorted by key
for sortedValue in sorted(dictionary.values()):
print sortedValue # gives the values sorted by value
Надеюсь, это поможет.
sorted(dictionary)
лучше, чем sorted(dictionary.keys())
@jamylak благодарит за предложение, но мне интересно, будет ли он вести себя по-другому, чем тогда .keys()
?
Это семантически эквивалентно, но быстрее и идиоматичнее
Чтобы получить значения, используйте
sorted(data.values())
Чтобы получить совпадающие ключи, используйте функцию key
sorted(data, key=data.get)
Чтобы получить список кортежей, упорядоченных по значению
sorted(data.items(), key=lambda x:x[1])
По теме: см. Обсуждение здесь: Словари упорядочены в Python 3.6+
Окей, прости. Я имел в виду получить (2: 'a', 1: 'b') ... какие-нибудь идеи?
@kingRauk, dict не упорядочены, но вы можете составить упорядоченный список кортежей
отсортировано (data.items (), key = lambda x: x [1], reverse = True) для повторного порядка
возможный дубликат сортировки значений словаря Python
А что, если мне нужен список ключей, отсортированный по значению? Таким образом, оригинал вернет [2, 1], это может быть список игроков, отсортированный по их счетам, например, отбрасывая оценки.
@gseattle
sorted(data.keys(), key=data.get)