I've been struggling with sorting a list based on a previous sorted list in Python 3 for a while and though I would ask for help from you guys.
Ok, so I have a list:
list = ['A103', 'A101', 'C101', 'B101']
This list is sorted in an alphabetic and then numeric way with the following code:
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)
The new list, list_sorted looks like this: ['A101', 'A103', 'B101', 'C101'].
Now to the tricky part, I have another list with values corresponding to the values in "list" which need to be sorted in the same way.
Example:
list = ['A103', 'A101', 'C101', 'B101']
rad = ['£', '$', '€', '@']
list_sorted =['A101', 'A103', 'B101', 'C101']
rad = ['$', '£', '@', '€'].
All help is highly appreciated, thank you!
解决方案
Do not attempt to sort twice. Instead, zip both lists together before sorting and only sort with regard to the first item.
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', '€')]
This can easily be generalized to more than two lists with unpacking.
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)]