Home > front end >  sort a dict based on another dict value
sort a dict based on another dict value

Time:11-03

I have two dicts like so:

dict1={'key10': {'fail_pass': 1, 'score': 29.5}, 'key20': {'fail_pass': 0, 'score': 37.25}, 'key30': {'fail_pass': 0, 'score': 25.75}, 'key60': {'fail_pass': 1, 'score': 225.75}, 'key70': {'fail_pass': 1, 'score': 25.25}, 'key170': {'fail_pass': 1, 'score': 0.25}}
dict2={'key10': 1, 'key20': 1, 'key60': 1}

I would like to sort dict2 based on the score of dict1. So, in this case, I want back the dict2 ordered like so:

sorted_dict2={'key60': 1, 'key20': 1, 'key10': 1}

` How do I achieve this?

CodePudding user response:

You can sort your dictonary using sorted function and lambda to access the parameters you want to sort:

dict1={'key10': {'fail_pass': 1, 'score': 29.5}, 'key20': {'fail_pass': 0, 'score': 37.25}, 'key30': {'fail_pass': 0, 'score': 25.75}, 'key60': {'fail_pass': 1, 'score': 225.75}, 'key70': {'fail_pass': 1, 'score': 25.25}, 'key170': {'fail_pass': 1, 'score': 0.25}}
dict2={'key10': 1, 'key20': 1, 'key60': 1}

sortedDict = dict(sorted(dict2.items(), key=lambda x: dict1[x[0]]['score'], reverse=True))

print(sortedDict)

CodePudding user response:

Solution is easy, just pass custom key to built-in sorted():

dict1 = {'key10': {'fail_pass': 1, 'score': 29.5},
         'key20': {'fail_pass': 0, 'score': 37.25},
         'key30': {'fail_pass': 0, 'score': 25.75},
         'key60': {'fail_pass': 1, 'score': 225.75},
         'key70': {'fail_pass': 1, 'score': 25.25},
         'key170': {'fail_pass': 1, 'score': 0.25}}
dict2 = {'key10': 1, 'key20': 1, 'key60': 1}

sorted_dict2 = dict(sorted(dict2.items(), key=lambda x: dict1[x[0]]['score'], 
                           reverse=True))

If you also need to merge values of both dictionaries, you can sort just keys and then create a dictionary using dict comprehension:

sorted_dict2 = {key: {"value": dict2[key], **dict1[key]}
                for key in sorted(dict2, key=lambda x: dict1[x]['score'],
                                  reverse=True)}

CodePudding user response:

This is more about the explanation of how exactly it gets the values to sort by (explained in code comments):

dict1 = {'key10': {'fail_pass': 1, 'score': 29.5}, 'key20': {'fail_pass': 0, 'score': 37.25}, 'key30': {'fail_pass': 0, 'score': 25.75}, 'key60': {'fail_pass': 1, 'score': 225.75}, 'key70': {'fail_pass': 1, 'score': 25.25}, 'key170': {'fail_pass': 1, 'score': 0.25}}
dict2 = {'key10': 1, 'key20': 1, 'key60': 1}


def sorter(key_value_tuple):
    # `sorted` calls this function by going over each item
    # in `dict2.items()` and passes the item in this case
    # a tuple like this: ('key10', 1)
    
    # so here happens a simple tuple unpacking
    # `key = 'key10'` and `value = 1`
    key, value = key_value_tuple
    # access the dictionary in `dict1`, in this example
    # `value_in_dict1 = {'fail_pass': 1, 'score': 1}`
    value_in_dict1 = dict1[key]
    # then get the score part
    score = value_in_dict1['score']
    # and return the score value `score = 29.5`
    # and so for each item in `dict2.items()`
    return score


sorted_dict = {k: v for k, v in sorted(dict2.items(), key=sorter, reverse=True)}

# also you seemingly don't need a `dict` so you could just use a list
# sorted_values = sorted(dict2, key=lambda x: dict1[x]['score'], reverse=True)
# print(sorted_values)

print(sorted_dict)
  • Related