2013-10-10 5 views
1

Я пытаюсь отсортировать список кортежей в первом элементе кортежа, используя специальный предварительно определенный список в качестве желаемого порядка. Поэтому у меня есть список, какpython сортировать список кортежей на пользовательском сортировке

my_list=(['chr1',12],['chrX',32],['chr2',1],['chr1',79],['chr2',6]) 

и предопределенный список на первом элементе

custom_list=['chr1','chr2','chrX'] 

Я хочу выход быть

(['chr1',12],['chr1',79],['chr2',1],['chr2',6],['chrX',32]) 

(На данный момент, сортировка на второй элемент не нужен.) Я не могу понять, как это сделать. Может ли кто-нибудь помочь?

+5

У вас есть там кортеж списков, а не список кортежей. – arshajii

ответ

3

Вы можете использовать функцию list.index() повернуть положение в custom_list в качестве ключа сортировки:

sorted(my_list, key=lambda x: (custom_list.index(x[0]), x[1])) 

Вы можете захотеть, чтобы превратить ваш custom_list в словарь, однако, для более быстрого отображения:

custom_list_indices = {v: i for i, v in enumerate(custom_list)} 
sorted(my_list, key=lambda x: (custom_list_indices.get(x[0]), x[1])) 

Словарь поиска занимает постоянное время, list.index() Время прямо пропорционально длине списка.

Другим преимуществом является то, что со словарем вы можете вернуть значение по умолчанию для записей, не найденных в словаре (None в этом примере); list.index() вместо этого поднимет исключение ValueError.

Демо:

>>> my_list=(['chr1',12],['chrX',32],['chr2',1],['chr1',79],['chr2',6]) 
>>> custom_list=['chr1','chr2','chrX'] 
>>> sorted(my_list, key=lambda x: (custom_list.index(x[0]), x[1])) 
[['chr1', 12], ['chr1', 79], ['chr2', 1], ['chr2', 6], ['chrX', 32]] 
>>> custom_list_indices = {v: i for i, v in enumerate(custom_list)} 
>>> sorted(my_list, key=lambda x: (custom_list_indices.get(x[0]), x[1])) 
[['chr1', 12], ['chr1', 79], ['chr2', 1], ['chr2', 6], ['chrX', 32]] 
+0

Большое спасибо за это. Как насчет случая, когда вместо списка кортежей у меня есть список объектов? И я хочу отсортировать по полю в этом объекте в массиве custom_list? – user2689782

Смежные вопросы