Reputation: 174
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!
Upvotes: 0
Views: 70
Reputation: 22294
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)]
Upvotes: 2
Reputation: 212
You can do using this
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
Hope it will help.
Upvotes: 0