Skip to content
Advertisement

Convert string list values of dictionary into ranked integers, but with their ranks + 1 and descending

Additionally, if the original dictionary has only one value, it gets a score of 1. For example, a dict that looks like this:

{
    'q1': ['d184', 'd29', 'd879', 'd880'],
    'q2': ['d12', 'd15', 'd658'],
    'q3': ['d10']
}

Would become the following:

{
    'q1': [5, 4, 3, 2],
    'q2': [4, 3, 2],
    'q3': [1] 
}

This is a start for a dictionary with 2 keys, not including the 1-value situation:

dct = {
    'q1': ['d184', 'd29', 'd879', 'd880'],
    'q2': ['d12', 'd15', 'd658'] 
}
new_dict = {}
new_values = []
for key in dct.keys():
    length = len(dct[key])
    values = []
    for num in range(length+2):
        values.append(num)
    sort_ed = sorted(values, key=int, reverse=True)[:-2]
    new_values.append(sort_ed)
print(new_values)

[[5, 4, 3, 2], [4, 3, 2]]

That’s what I want for the values, now I just need to set the keys of a new dictionary to the keys of the original one, and assign the values from new_values.

Advertisement

Answer

Here is a solution, using range to rank the elements

from collections import defaultdict

d = {
    'q1': ['d184', 'd29', 'd879', 'd880'],
    'q2': ['d12', 'd15', 'd658'],
    'q3': ['d10']
}

ranks_ = defaultdict(list)

for k, v in d.items():
    rank_inc = bool(len(v) > 1)  # If length of list is > 1 decrement by 1

    for i in range(len(v), 0, -1):
        ranks_[k].append(i + rank_inc)

print(ranks_)

defaultdict(<class 'list'>, {'q1': [5, 4, 3, 2], 'q2': [4, 3, 2], 'q3': [1]})
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement