words = ['Talk', 'is', 'cheap', 'Show', 'me', 'the', 'code', 'by', 'Linus', 'Torvalds']
# simple solution that uses loops a lot:
indexes = list(range(len(words)))
indexes.sort(key=lambda i: words[i].lower())
ranks = {}
for r, i in enumerate(indexes):
ranks[i] = r
ranked_words = []
for i, w in enumerate(words):
ranked_words.append((w, ranks[i]))
print(ranked_words)
# three line solution that uses list & dict comprehension:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = {i: r for r, i in enumerate(indexes)}
ranked_words = [(w, ranks[i]) for i, w in enumerate(words)]
print(ranked_words)
# two more options to construct ranks:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(zip(indexes, range(len(words))))
ranked_words = [(w, ranks[i]) for i, w in enumerate(words)]
print(ranked_words)
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(map(reversed, enumerate(indexes)))
ranked_words = [(w, ranks[i]) for i, w in enumerate(words)]
print(ranked_words)
# three more options to construct ranked_words:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(map(reversed, enumerate(indexes)))
ranked_words = list(zip(words, (ranks[i] for i in range(len(words)))))
print(ranked_words)
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(map(reversed, enumerate(indexes)))
ranked_words = list(zip(words, map(ranks.get, range(len(words)))))
print(ranked_words)
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(map(reversed, enumerate(indexes)))
ranked_words = [(words[i], ranks[i]) for i in range(len(words))]
print(ranked_words)
# no low level indexes:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(map(reversed, enumerate(indexes)))
ranked_words = list(zip(words, map(ranks.get, range(len(words)))))
print(ranked_words)
# combine in two long lines:
ranks = dict(map(reversed, enumerate(sorted(range(len(words)), key=lambda i: words[i].lower()))))
ranked_words = list(zip(words, map(ranks.get, range(len(words)))))
print(ranked_words)
# alternative solution, which calls sort-method twice:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranks = dict(zip(indexes, range(len(words))))
ranked_words = [(words[i], r) for i, r in sorted(ranks.items())]
print(ranked_words)
# exclude the construction of ranks:
indexes = sorted(range(len(words)), key=lambda i: words[i].lower())
ranked_words = [(words[i], r) for i, r in sorted(zip(indexes, range(len(words))))]
print(ranked_words)
# in one single line:
ranked_words = [(words[i], r) for i, r in sorted(zip(sorted(range(len(words)), key=lambda i: words[i].lower()), range(len(words))))]
print(ranked_words)