Учитывая два списка в Python, один со строками и один с объектами, как вы их отображаете? - PullRequest
4 голосов
/ 05 июня 2011

У меня есть список строк

string_list = ["key_val_1", "key_val_2", "key_val_3", "key_val_4", ...]

и список с объектами

object_list = [object_1, object_2, object_3,...]

Каждый объект object_i имеет атрибут key.

Я хочу отсортировать объекты в object_list по порядку string_list.

Я мог бы сделать что-то вроде

new_list = []
for key in string_list:    
    for object in object_list:
        if object.key == key:
            new_list.append(object)

но должен быть более питонический путь, чем этот грубый силовой путь. :-) Как бы вы решили это?

Ответы [ 3 ]

8 голосов
/ 05 июня 2011

Сначала создайте словарь, сопоставляющий ключи объекта с объектами:

d = dict((x.key, x) for x in object_list)

Далее создайте отсортированный список, используя понимание списка:

new_list = [d[key] for key in string_list]
2 голосов
/ 05 июня 2011

Сопоставить каждому ключу его желаемый приоритет:

key_precedence = dict((x, n) for n, x in enumerate(string_list))

Затем выполнить сортировку по приоритету:

object_list.sort(key=lambda x: key_precedence[x.key])

Для обработки ключей, которые могут отсутствовать в списке строк:

default = -1          # put "unknown" in front
default = sys.maxint  # put "unknown" in back
object_list.sort(key=lambda x: key_precedence.get(x.key, default))

Если string_list короткий (например, 10 или меньше элементов), вы можете упростить:

object_list.sort(key=lambda x: string_list.index(x.key))
# But it's more cumbersome to handle defaults this way.

Однако это запрещено для больших длин string_list.

0 голосов
/ 17 июня 2011

Вы можете использовать аргумент cmp метода sort ():

object_list.sort(cmp=lambda x,y: cmp(string_list.index(x.key),
                                     string_list.index(y.key)))

или использовать sorted (), чтобы избежать подстановки на месте:

sorted(object_list, cmp=lambda x,y: cmp(string_list.index(x.key),
                                        string_list.index(y.key)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...