Сортировка списка, содержащего словарь в Python3 - PullRequest
3 голосов
/ 10 июля 2020

У меня есть 2 весьма вложенных Python словаря, и я хотел бы их сравнить (мои настоящие файлы Json содержат сотни тысяч строк). Эти словари содержат списки, а эти списки содержат словари. Порядок элементов не фиксирован, и это не проблема в случае словаря, но в случае списка. Поэтому мне нужно отсортировать элементы в моей структуре.

Я написал алгоритм сортировки, который рекурсивно сортирует элементы в моей структуре данных.

Мой код работает должным образом с Python2 .7 исполняемый файл, но он не работает с исполняемым файлом Python3 .6.6.

Я уже читал официальную документацию Python и знаю, что list.sort() был изменен между Python2 и Python3 , но я считаю, что это довольно большое ограничение в Python3.

Я знаком с параметром key, но он не решает мою проблему. Кроме того, ключи в dicts не совпадают.

Итак, мой вопрос: можно ли отсортировать список, содержащий больше элементов типа, как в моем случае?

Код :

test_1 = {"aaa": 111, "bbb": 222, "ccc": [{"o": [1, "t"]}, "a", "b", 1, [1, 2, [4, 3, [6, 5]]]]}
test_2 = {"bbb": 222, "aaa": 111, "ccc": [[2, 1, [3, 4, [5, 6]]], 1, "a", "b", {"o": ["t", 1]}]}


def list_sort(l):
    if isinstance(l, list):
        l.sort()
        for x in l:
            list_sort(x)


def dict_sorter(d):
    for k, v in d.items():
        if isinstance(v, dict):
            dict_sorter(v)
        elif isinstance(v, list):
            v.sort()
            for x in v:
                if isinstance(x, dict):
                    dict_sorter(x)
                elif isinstance(x, list):
                    list_sort(x)


print("\n\nBEFORE:")
print(test_1)
print(test_2)
print("EQ: {}".format(test_1 == test_2))

dict_sorter(test_1)
dict_sorter(test_2)

print("\n\nAFTER:")
print(test_1)
print(test_2)
print("EQ: {}".format(test_1 == test_2))

Вывод с Python2:

>>> python2 test.py

BEFORE:
{'aaa': 111, 'bbb': 222, 'ccc': [{'o': [1, 't']}, 'a', 'b', 1, [1, 2, [4, 3, [6, 5]]]]}
{'aaa': 111, 'bbb': 222, 'ccc': [[2, 1, [3, 4, [5, 6]]], 1, 'a', 'b', {'o': ['t', 1]}]}
EQ: False

AFTER:
{'aaa': 111, 'bbb': 222, 'ccc': [1, {'o': [1, 't']}, [1, 2, [3, 4, [5, 6]]], 'a', 'b']}
{'aaa': 111, 'bbb': 222, 'ccc': [1, {'o': [1, 't']}, [1, 2, [3, 4, [5, 6]]], 'a', 'b']}
EQ: True

Вывод с Python3:

>>> python3 test.py

BEFORE:
{'aaa': 111, 'bbb': 222, 'ccc': [{'o': [1, 't']}, 'a', 'b', 1, [1, 2, [4, 3, [6, 5]]]]}
{'bbb': 222, 'aaa': 111, 'ccc': [[2, 1, [3, 4, [5, 6]]], 1, 'a', 'b', {'o': ['t', 1]}]}
EQ: False
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    dict_sorter(test_1)
  File "test.py", line 17, in dict_sorter
    v.sort()
TypeError: '<' not supported between instances of 'str' and 'dict'

1 Ответ

0 голосов
/ 18 июля 2020

В python2 возможно сравнение любых данных с любыми другими данными. Но в python3 это невозможно.

[Ссылка]

https://portingguide.readthedocs.io/en/latest/comparisons.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...