Сортировка списка на основе того, как был отсортирован другой список.Python 3 - PullRequest
0 голосов
/ 12 июня 2018

Я некоторое время боролся с сортировкой списка на основе предыдущего отсортированного списка в Python 3, и хотя я бы попросил помощи у вас, ребята.

Хорошо, поэтому у меня есть список:

list = ['A103', 'A101', 'C101', 'B101'] 

Этот список отсортирован в алфавитном, а затем числовом формате со следующим кодом:

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
list_sorted = sorted(list, key=alphanum_key)

Новый список list_sorted выглядит так: ['A101', 'A103', 'B101', 'C101'].

Теперь к хитрой части, у меня есть другой список со значениями, соответствующими значениям в «списке», которые должны быть отсортированы таким же образом.

Пример:

list = ['A103', 'A101', 'C101', 'B101'] 

rad = ['£', '$', '€', '@']


list_sorted =['A101', 'A103', 'B101', 'C101']

rad = ['$', '£', '@', '€'].

ВсеПомощь высоко ценится, спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете использовать это

list1 = ['A103', 'A101', 'C101', 'B101'] 
list2 = ['£', '$', '€', '@']
list3 = [4,3,2,1]

list_sorted1, list_sorted2, list_sorted3 = zip(*sorted(zip(list1, list2, list3))) # sort all list according to list1

Надеюсь, это поможет.

0 голосов
/ 12 июня 2018

Не пытайтесь сортировать дважды.Вместо этого, перед сортировкой объедините оба списка вместе и отсортируйте только по первому элементу.

import re

list = ['A103', 'A101', 'C101', 'B101']
rad = ['£', '$', '€', '@']

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key[0])]
#                                           only consider first item ----^

list_sorted = sorted(zip(list, rad), key=alphanum_key)
#   zip both lists ---^

print(list_sorted) # [('A101', '$'), ('A103', '£'), ('B101', '@'), ('C101', '€')]

Это можно легко обобщить для более чем двух списков с распаковкой.

list = ['A103', 'A101', 'B101']
rad = ['£', '$', '@']
more = [1, 2, 3]

lists = list, rad, more

...

list_sorted = sorted(zip(*lists), key=alphanum_key)

print(list_sorted) # [('A101', '$', 2), ('A103', '£', 1), ('B101', '@', 3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...