Сортировка словарных ключей по их значениям - PullRequest
17 голосов
/ 14 января 2011

У меня есть настройка словаря Python, например:

mydict = { 'a1': ['g',6],
           'a2': ['e',2],
           'a3': ['h',3],
           'a4': ['s',2],
           'a5': ['j',9],
           'a6': ['y',7] }

Мне нужно написать функцию, которая возвращает упорядоченные ключи в списке, в зависимости от того, по какому столбцу вы сортируете, например, если мы сортируемна mydict [ключ] [1] (по возрастанию)

Я должен получить список обратно примерно так:

['a2', 'a4', 'a3', 'a1', 'a6', 'a5']

В основном это работает, за исключением случаев, когда у вас есть столбцы одного значения для несколькихключи, например'a2': ['e', 2] и 'a4': ['s', 2].В этом случае он возвращает список следующим образом:

['a4', 'a4', 'a3', 'a1', 'a6', 'a5']

Вот функция, которую я определил

def itlist(table_dict,column_nb,order="A"):
    try:
        keys = table_dict.keys()
        values = [i[column_nb-1] for i in table_dict.values()]
        combo = zip(values,keys)
        valkeys = dict(combo)
        sortedCols = sorted(values) if order=="A" else sorted(values,reverse=True)
        sortedKeys = [valkeys[i] for i in sortedCols]
    except (KeyError, IndexError), e:
        pass
    return sortedKeys

И если я хочу отсортировать столбец чисел, например, он называется какитак

sortedkeysasc = itmethods.itlist(table,2)

Так что, есть предложения?

Пол

Ответы [ 5 ]

46 голосов
/ 14 января 2011

Не будет ли намного проще использовать

sorted(d, key=lambda k: d[k][1])

d словарем)?

9 голосов
/ 14 января 2011
>>> L = sorted(d.items(), key=lambda (k, v): v[1])
>>> L
[('a2', ['e', 2]), ('a4', ['s', 2]), ('a3', ['h', 3]), ('a1', ['g', 6]), ('a6', ['y', 7]), ('a5', ['j', 9])]

>>> map(lambda (k,v): k, L)
['a2', 'a4', 'a3', 'a1', 'a6', 'a5']

Здесь вы сортируете элементы словаря (пары ключ-значение), используя ключ - вызываемый, который устанавливает общий порядок элементов.

Затем вы просто отфильтровываетенеобходимые значения, используя map с lambda, который просто выбирает ключ.Таким образом, вы получите необходимый список ключей.


РЕДАКТИРОВАТЬ: см. этот ответ для гораздо лучшего решения.

3 голосов
/ 14 января 2011

Хотя есть несколько рабочих ответов выше, небольшое изменение / комбинация из них является наиболее питоническим для меня:

[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])]
1 голос
/ 14 января 2011
>>> mydict = { 'a1': ['g',6],
...            'a2': ['e',2],
...            'a3': ['h',3],
...            'a4': ['s',2],
...            'a5': ['j',9],
...            'a6': ['y',7] }
>>> sorted(mydict, key=lambda k:mydict[k][1])
['a2', 'a4', 'a3', 'a1', 'a6', 'a5']
>>> sorted(mydict, key=lambda k:mydict[k][0])
['a2', 'a1', 'a3', 'a5', 'a4', 'a6']
0 голосов
/ 14 января 2011
def itlist(table_dict, col, desc=False):
    return [key for (key,val) in
        sorted(
            table_dict.iteritems(),
            key=lambda x:x[1][col-1],
            reverese=desc,
            )
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...