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.