Python 2 to 3 dict sorting - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Python 2 to 3 dict sorting (/thread-26795.html) |
Python 2 to 3 dict sorting - joshuaprocious - May-13-2020 Hello, We have an app that provides a list of searchable multi-layered items originally written in 2.7 and we're converting to 3.8.2. It is hosted on Heroku and is backed by a git repo for those items it displays on its pages. I have followed the future package tutorial found here https://python-future.org/automatic_conversion.html and have worked through all dependency work. I have appended 'b' to those elements that were originally referenced as binary-strings in 2.7 and which are need to now be explicitly stated. I am now caught at sections.sort() line 26 : def get_sections(): sections = [] for path,dirs,files in os.walk(folder): print("path: {} dir: {} ".format(path, dirs)) dirs[:] = [d for d in dirs if not d[0] == '.' ] for filename in files: # section folder if filename.lower() == "readme.md" and len(dirs) != 0 and path != folder: # print os.path.join(path,filename) pth = os.path.join(re.sub(folder, '', path), filename) pth = pth.lstrip('/') with open(os.path.join(path,filename), 'rb') as readme: description = readme.read() description = description.replace(b"##", b"") section_name = path.split(os.path.sep)[-1] section = { "name": section_name, "description": description, "slug": urllib.parse.quote(section_name), "examples": [] } sections.append(section) sections.sort() return sections The error I get is "TypeError: '<' not supported between instances of 'dict' and 'dict'" Since finding out Python 3 doesn't support sorting dicts the same way Python 2 does I changed it to sections = {k: disordered[k] for k in sorted(sections)} and still get "TypeError: '<' not supported between instances of 'dict' and 'dict'" Any general guidance on what is happening between the dictionaries I'm creating and sorting would be much appreciated. RE: Python 2 to 3 dict sorting - DeaD_EyE - May-14-2020 Funny, I even did not know that you can't do that. But there is a solution. You can use the key-function to convert the keys to a tuple or list. Then this object is used for comparison. sorted([{-21: None, 2: None}, {-100: None, -2: None}], key=lambda x: tuple(x.keys()))The key-function can also written as normal function: def dict_sort(mapping): return tuple(mapping.keys()) sorted([{-21: None, 2: None}, {-100: None, -2: None}], key=dict_sort)You can also choose a key, which you want to use for sorting or you can select values to sort the dict. It depends on what you want to reach. RE: Python 2 to 3 dict sorting - joshuaprocious - May-14-2020 Thank you DeaD_EyE. I appreciate the full response and the function inclusion! |