python sort list of json by value python sort list of json by value python python

python sort list of json by value


Write a function that uses try...except to handle the KeyError, then use this as the key argument instead of your lambda.

def extract_time(json):    try:        # Also convert to int since update_time will be string.  When comparing        # strings, "10" is smaller than "2".        return int(json['page']['update_time'])    except KeyError:        return 0# lines.sort() is more efficient than lines = lines.sorted()lines.sort(key=extract_time, reverse=True)


You can use dict.get() with a default value:

lines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)

Example:

>>> lines = [...     {"page": {"url": "url1", "update_time": "1415387875"}, "other_key": {}},...     {"page": {"url": "url2", "update_time": "1415381963"}, "other_key": {}},...     {"page": {"url": "url3", "update_time": "1415384938"}, "other_key": {}},...     {"page": {"url": "url4"}, "other_key": {}},...     {"page": {"url": "url5"}, "other_key": {}}... ]>>> lines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)>>> for line in lines:...     print line... {'other_key': {}, 'page': {'url': 'url1', 'update_time': '1415387875'}}{'other_key': {}, 'page': {'url': 'url3', 'update_time': '1415384938'}}{'other_key': {}, 'page': {'url': 'url2', 'update_time': '1415381963'}}{'other_key': {}, 'page': {'url': 'url4'}}{'other_key': {}, 'page': {'url': 'url5'}}

Though, I would still follow the EAFP principle that Ferdinand suggested - this way you would also handle cases when page key is also missing. Much easier to let it fail and handle it than checking all sorts of corner cases.


# sort jsonlines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)