Поиск и сортировка словаря в Python - PullRequest
2 голосов
/ 26 февраля 2012

Мне нужно отсортировать и найти в словаре. Я знаю, что словарь не может быть отсортирован. Но все, что мне нужно, это сделать поиск в отсортированном формате. Сам словарь не нужно сортировать.

Есть 2 значения. Строка, которая является ключом и связана с ключом, является целочисленным значением. Мне нужно получить отсортированное представление на основе целого числа. Я могу получить это с помощью OrderedDict.

Но вместо всего словаря мне нужно вывести только 50 лучших значений. И мне нужно извлечь некоторые ключи с помощью RegEx. Произнесите все ключи, начинающиеся с буквы «а» и имеющие длину 5.

Может, кто-нибудь подскажет, как печатать в хорошем формате на python? Нравится:

{'secondly': 2, 
'pardon': 6, 
'saves': 1, 
'knelt': 1}

за одну строку. Спасибо за ваше время.

Ответы [ 6 ]

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

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

d = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1}
a = sorted(d.iteritems(), key=lambda x:x[1], reverse=True)

a будет содержать список кортежей:

[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)]

То, что вы можете ограничить до 50 лучших с помощью a[:50], а затем искать по ключам, используя шаблон поиска.

2 голосов
/ 27 февраля 2012

Есть несколько способов получить сортированный дикт, sorted и iteritems() - ваши друзья.

data = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1}

Шаблон, который я использую чаще всего:

key = sorted(data.iteritems())
print key   #[('knelt', 1), ('pardon', 6), ('saves', 1), ('secondly', 2)]

key_desc = sorted(data.iteritems(), reverse=True)
print key_desc #[('secondly', 2), ('saves', 1), ('pardon', 6), ('knelt', 1)]

Для сортировки по значению, а не по ключу, вам необходимо переопределить функцию сортированного ключа.

value = sorted(data.iteritems(), key=lambda x:x[1])
print value #[('saves', 1), ('knelt', 1), ('secondly', 2), ('pardon', 6)]

value_desc = sorted(data.iteritems(),key=lambda x:x[1], reverse=True)
print value_desc #[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)]
1 голос
/ 26 февраля 2012

Существует несколько различных инструментов, которые могут вам помочь:

  • Функция sorted принимает итерацию и выполняет итерацию по элементам по порядку. Так что вы могли бы сказать что-то вроде for key, value in d.iteritems().
  • Функция filter принимает итерацию и функцию и возвращает только те элементы, для которых функция оценивается как True. Так, например, filter(lambda x: your_condition(x), d.iteritems()) выдаст вам список кортежей со значением ключа, которые вы затем сможете отсортировать, как указано выше. (В Python 3 filter возвращает итератор, что еще лучше.)
  • Выражения генератора позволяют объединить все вышеперечисленное в одно. Например, если вы заботитесь только о значениях, вы можете написать (value for key, value in sorted(d.iteritems()) if condition), что будет возвращать итератор.
1 голос
/ 26 февраля 2012

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

dict = {'secondly': 2, 
        'pardon': 6, 
        'saves': 1, 
        'knelt': 1}

for key in sorted(dict.keys()): 
    print dict[key]

Это позволит отсортировать вывод на основе ключей. (В вашем случае строковые значения в алфавитном порядке)

1 голос
/ 26 февраля 2012

Для хорошего форматирования проверьте модуль печати .

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

import re, operator
thedict = {'secondly':2, 'pardon':6, ....}
pat = re.compile('^a....$') # or whatever
top50 = sorted(((k,v) for (k,v) in thedict.iteritems() if pat.match(k)), reverse=True, key=operator.itemgetter(1))[:50]
1 голос
/ 26 февраля 2012

Поскольку вы уже используете OrderedDict, вы, вероятно, можете делать то, что вам нужно, с пониманием списка. Что-то вроде:

[ value for value in d.values()[:50] if re.match('regex', value) ]

Пожалуйста, оставьте свой текущий код, если вам нужно что-то более конкретное.

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

In [1]: import pprint
In [2]: d = {'a': 'a', 'b': 'b' }
In [4]: pprint.pprint(d)
{'a': 'a', 'b': 'b'}
In [6]: pprint.pprint(d,width=20)
{'a': 'a',
 'b': 'b'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...