0

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!

2
  • 2
    What have you tried so far? Commented Jun 12, 2018 at 13:25
  • Why don't you use a dictionary to store the data? that way you would need to sort accordingly once Commented Jun 12, 2018 at 13:27

2 Answers 2

2

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)]
Sign up to request clarification or add additional context in comments.

2 Comments

This looks very promising! There are actually multiple lists which need to be sorted based on the sorting of "list", is it possible to zip them all togheter like this? Thanks a lot Oliver.
Thank you very much! I very much appreciate the way you have explained the steps in the code as well.
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.