Произвольный порядок кортежа, вложенного в список в Python - PullRequest
2 голосов
/ 27 ноября 2011

У меня есть список кортежей вроде следующего, который я получаю от Solr:

 [('Second Circuit', 34), ('Ninth Circuit', 24), ('Third Circuit', 4), ('Eleventh Circuit', 2)]

Обратите внимание, что были возвращены не только второй, третий, девятый и одиннадцатый контуры.

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

COURT_ORDER = (
    'Supreme Court',
    'First Circuit',
    'Second Circuit',
    'Third Circuit',
    'Fourth Circuit',
    ...and so on...,
)

Желаемый результат после сортировки будет:

 [('Second Circuit', 34), ('Third Circuit', 4), ('Ninth Circuit', 24), ('Eleventh Circuit', 2)]

Есть ли умный способ сделать это?

(Это нужно пометить тегом Sunburnt, если это возможно, но я не могу его создать из-за отсутствия очков.)

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Создайте словарь, который сопоставляет название суда с желаемым рейтингом.Затем выполните сортировку с помощью ключевой функции , которая ищет название суда, чтобы найти рейтинг:

>>> COURT_ORDER = (
    'Supreme Court',
    'First Circuit',
    'Second Circuit',
    'Third Circuit',
    'Fourth Circuit',
    'Ninth Circuit',
    'Eleventh Circuit',
)
>>> court_seq = dict(zip(COURT_ORDER, range(len(COURT_ORDER))))
>>> lot = [('Second Circuit', 34), ('Ninth Circuit', 24), ('Third Circuit', 4), ('Eleventh Circuit', 2)]
>>> sorted(lot, key=lambda t: court_seq[t[0]])
[('Second Circuit', 34), ('Third Circuit', 4), ('Ninth Circuit', 24), ('Eleventh Circuit', 2)]

Для получения дополнительной информации о том, как сортировать, см. Сортировка HOWTO .

2 голосов
/ 27 ноября 2011

key предметы в соответствии с index первого появления их [0] предмета в COURT_ORDER:

data = [('Second Circuit', 34), ('Ninth Circuit', 24), ('Third Circuit', 4), ('Eleventh Circuit', 2)]
sorted(data, key = lambda x: COURT_ORDER.index(x[0]))
...