Home > other >  How to sort a list of strings in terms of a duplicate re-ordered copy
How to sort a list of strings in terms of a duplicate re-ordered copy

Time:12-04

Take these two list of strings for example.

names = ['Jack', 'Steve', 'Marc', 'Xavier', 'Bob']
names_copy = ['Steve', 'Marc', 'Xavier', 'Bob', 'Jack']

Essentially I'm trying to find a way to sort names_copy in the same way that names is sorted.

So, a sorted version of names_copy would result in ['Jack', 'Steve', 'Marc', 'Xavier', 'Bob']

NOTE: in my program, names_copy is being created with a map, so I cannot use .sort(), sorted() works however.

I understand the sorted() function takes in a key parameter indicating the sort order, but I'm not too sure how to use it here.

CodePudding user response:

The easiest way would be to do:

names_copy_sorted = sorted(names_copy, key=names.index)

This assumes that every item in names_copy is actually an item in names. But this solution isn't very efficient. It would be more efficient to create a dictionary that assigns a priority to the items from names and then uses those priorities as key. For example:

priorities = dict((n, i) for i, n in enumerate(names))
names_copy_sorted = sorted(names_copy, key=priorities.get)

If there are items in names_copy that aren't in names then you could adjust that with something like:

priorities = dict((n, i) for i, n in enumerate(names))
default = len(priorities)
def key(name): return priorities.get(name, default)

names_copy_sorted = sorted(names_copy, key=key)

This way the items in names_copy that are not in names are pushed to the back.

Be aware that duplicates in names are dealt with differently: names.index uses the first occurrence as priority, while the priorities.get version uses the last.

CodePudding user response:

  1. First we have a List that contains duplicates:
  2. Create a dictionary, using the List items as keys. This will automatically remove any duplicates because dictionaries cannot have duplicate keys.
  3. Then, convert the dictionary back into a list: Now we have a List without any duplicates, and it has the same order as the original List.

I hope this helps.

  • Related