Ответ 1
Не было бы намного проще использовать
sorted(d, key=lambda k: d[k][1])
(с d
, являющимся словарем)?
У меня есть установка словаря для python, например
mydict = { 'a1': ['g',6],
'a2': ['e',2],
'a3': ['h',3],
'a4': ['s',2],
'a5': ['j',9],
'a6': ['y',7] }
Мне нужно написать функцию, которая возвращает упорядоченные ключи в списке, в зависимости от того, какой столбец сортируется, например, если мы сортируем по mydict [key] [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)
Итак, любые предложения?
Пол
Не было бы намного проще использовать
sorted(d, key=lambda k: d[k][1])
(с d
, являющимся словарем)?
>>> 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
, который просто выбирает ключ. Таким образом, вы получаете необходимый список ключей.
EDIT: см. этот ответ для более эффективного решения.
Хотя есть несколько рабочих ответов выше, небольшая вариация/комбинация из них для меня самая пифоническая:
[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])]
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,
)
]
>>> 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']