python: как отсортировать dict сначала по значению (может быть пустым / нет / True / False), а затем по ключу - PullRequest
0 голосов
/ 07 октября 2019

У меня есть следующий dict:

Все значения либо строковые, либо None, либо пустые, либо логические (True / False)

{
 'id': None,
 'last_login': None,
 'is_superuser': False,
 'is_staff': False,
 'date_joined': '2019-10-06',
 'password': 'pbkdf2_sha256$150000$zXmhAd1NIgI4$1wMGVVDGTSCXZmdFtIoIB/aB3/4nfMn6DnYIuXeRyr8=',
 'last_login_passwd': None,
 'last_login_otp': None,
 'last_password_change': None,
 'first_name': '',
 'last_name': '',
 'email': '',
 'is_active': False,
 'otp_pass_change': '',
 'first_otp_passlogin_create': '',
 'first_otp_otplogin_create': '',
 'about': '',
 'location': '',
 'birth_date': None,
 'first_otp_login_created_date': None,
 'first_pass_login_created_date': None,
 'modified_date': None}

Теперь я хочу увидеть этот dict, отсортированный на основена значения, а затем на основе ключей.

{
     'is_active' : FALSE,
     'is_staff' : FALSE,
     'is_superuser' : FALSE,
     'about' : '',
     'email' : '',
     'first_name' : '',
     'first_otp_otplogin_create' : '',
     'first_otp_passlogin_create' : '',
     'last_name' : '',
     'location' : '',
     'otp_pass_change' : '',
     'password' : 'pbkdf2_sha256$150000$zXmhAd1NIgI4$1wMGVVDGTSCXZmdFtIoIB/aB3/4nfMn6DnYIuXeRyr8=',
     'date_joined' : '2019-10-06',
     'birth_date' : None,
     'first_otp_login_created_date' : None,
     'first_pass_login_created_date' : None,
     'id' : None,
     'last_login_otp' : None,
     'last_login_passwd' : None,
     'last_login' : None,
     'last_password_change' : None,
     'modified_date' : None,
}

Как я могу это сделать.

Я ПЫТАЛСЯ:

test =     {
     'id': None,
     'last_login': None,
     'is_superuser': False,
     'is_staff': False,
     'date_joined': '2019-10-06',
     'password': 'pbkdf2_sha256$150000$zXmhAd1NIgI4$1wMGVVDGTSCXZmdFtIoIB/aB3/4nfMn6DnYIuXeRyr8=',
     'last_login_passwd': None,
     'last_login_otp': None,
     'last_password_change': None,
     'first_name': '',
     'last_name': '',
     'email': '',
     'is_active': False,
     'otp_pass_change': '',
     'first_otp_passlogin_create': '',
     'first_otp_otplogin_create': '',
     'about': '',
     'location': '',
     'birth_date': None,
     'first_otp_login_created_date': None,
     'first_pass_login_created_date': None,
     'modified_date': None}
sorted(test.items(), key=lambda kv: kv[1], reverse=True)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-453676f7d0ed> in <module>
     22      'first_pass_login_created_date': None,
     23      'modified_date': None}
---> 24 sorted(hare.items(), key=lambda kv: kv[1], reverse=True)

TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Согласно ЭТОМ невозможно сравнивать разные типы, и возникает ошибка TypeError. Вы можете сделать это:

test = dict(sorted(test.items(), key=lambda t: (str(t[1]), str(t[0]))))
0 голосов
/ 07 октября 2019

Используя str(kv[1]), как показано ниже.

test =     {
 'id': None,
 'last_login': None,
 'is_superuser': False,
 'is_staff': False,
 'date_joined': '2019-10-06',
 'password': 'pbkdf2_sha256$150000$zXmhAd1NIgI4$1wMGVVDGTSCXZmdFtIoIB/aB3/4nfMn6DnYIuXeRyr8=',
 'last_login_passwd': None,
 'last_login_otp': None,
 'last_password_change': None,
 'first_name': '',
 'last_name': '',
 'email': '',
 'is_active': False,
 'otp_pass_change': '',
 'first_otp_passlogin_create': '',
 'first_otp_otplogin_create': '',
 'about': '',
 'location': '',
 'birth_date': None,
 'first_otp_login_created_date': None,
 'first_pass_login_created_date': None,
 'modified_date': None}

print(sorted(test.items(), key=lambda kv: str(kv[1]), reverse=True))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...