18

I have a list that is filled with HTML elements. I also have a list filled with date/times, which is parallel to the HTML list.

How can I sort the HTML list based on the time/date list? The time/date is in a timestamp format.

4 Answers 4

26

You can use zip.

timestamps, elements = zip(*sorted(zip(timestamps, elements)))

The result will be two tuples which you can convert to lists if you prefer.

Sign up to request clarification or add additional context in comments.

4 Comments

@Thomas — Don't feel bad! sort() is in-place, while sorted() creates a new list, so sort() it typically what you want for big lists anyway. :-)
Thanks. What about backwards?
it is very strange that the same function can zip and unzip values. This makes it hard to understand the function.
zip does not unzip, but the * unpacks the sorted zip object, which is then again zipped by zip.
8

Zip the two lists up into tuples, sort, then take the HTML back out of the tuple:

zipped = zip(timestamps, htmls)
zipped.sort()
sorted_htmls = [html for (timestamp, html) in zipped]

Comments

2

Enumerate will give you a list of (index,item) tuples for each item in the list. You can sort this using the index to read the sort key from the timestamps list. Then peel off the html elements:

sorted_elems = [elem for i,elem in sorted(enumerate(html_elements), 
                                          key=lambda x:timestamps[x[0]])]

What could be simpler?

Comments

1

You can use a third-party package called more_itertools:

import more_itertools 

timestamps = ["08-11-17", "01-13-17", "11-22-17"]
elements = ["<p>", "<b>", "<a href>"]
more_itertools.sort_together([timestamps, elements])
# [('01-13-17', '08-11-17', '11-22-17'), ('<b>', '<p>', '<a href>')]

See more_itertools docs for more information.

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.