Pythonic способ сортировки списка объектов по значению dict (по ключу), содержащемуся в объекте - PullRequest
2 голосов
/ 17 января 2010

Я прошу совета по выполнению следующих действий более питоническим способом.

Подумайте:

class MyObj(object):
    def __init__(self):
        self.dict_properties = {}

Предположим, у меня есть список, содержащий несколько экземпляров MyObj:

mylist = [<__main__.MyObj object at 0x1005e3b90, ...]

Теперь я хочу отсортировать mylist на основе значения определенного ключа в dict_properties в MyObj.

Что работает:

mylist.sort(lambda x,y: cmp(x.dict_properties['mykey'],
                            y.dict_properties['mykey']))

но это вряд ли чувствует питон .

Есть ли лучший способ (возможно, используя operator.attrgetter)?

Ответы [ 3 ]

9 голосов
/ 17 января 2010
mylist.sort(key=lambda x: x.dict_properties['mykey'])

намного проще и быстрее.Вы можете достичь operator и попытаться составить attrgetter и itemgetter, но простое lambda (или def) здесь кажется самым простым.

3 голосов
/ 17 января 2010

Я бы просто сделал:

mylist.sort(key=lambda o: o.dict_properties["kykey"])

Вы также можете переиграть cmp в классе.

1 голос
/ 17 января 2010

Если скорость - проблема, тогда используйте decorate-sort-undecorate:

    mylist_decorated = [(elem.dict_properties['mykey'], elem) for elem in mylist]
    mylist_decorated.sort()
    mylist = [elem[1] for elem in mylist_decorated] # or zip(*mylist_decorated)[1] :)
  • таким образом sort () может расправить крылья.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...