Как отсортировать список, который является значением словарей? - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно отсортировать список, который является значением словарей, используя функцию с меньшими затратами на вычисления.Я не смог бы поделиться исходным кодом, поэтому, пожалуйста, помогите мне со следующим примером.

Я попытался с помощью стандартного подхода, я проанализировал значения, использовал промежуточный список для сортировки и сохранил его в новом словарекоторый очень интенсивно вычислений.Я пытаюсь упростить его, для этого я ожидаю каких-либо предложений или способов включения.

Ввод

a = {'a': 1, 'b': [2,8,4,3], 'c': ['c', 5,7, 'a', 6]}

Выход

a ={'a': 1, 'b': [2,3,4,8], 'c': ['a', 'c', 5,6,7]}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вам не нужно сортировать dict, вам нужно отсортировать все значения, которые являются списками внутри вашего dict.Вам вообще не нужно создавать какие-либо новые объекты:

a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings

for e in a:
    if isinstance(a[e],list):
        a[e].sort()         # inplace sort the lists

print(a)

Вывод:

{'a': 1, 'c': [5, 6, 7, 'a', 'c'], 'b': [2, 3, 4, 8]}

Это не создает новых диктовок и не создает новых списков - оно просто сортирует списокна месте.Вы не можете получить намного быстрее / меньше вычислительных ресурсов, чем это, если у вас нет специальных знаний о списках, которые сделали бы программирование специализированным сортировщиком по месту в качестве замены для list.sort ().


Вкл.Сравнение Python 3 (спасибо @Matthias Profil ) между int ansd str дает TypeError - вы можете «исправить» это с помощью некоторых необязательных вычислений (вдохновленных ответами по адресу: python-list-sort-query-when-list-содержит-разные-типы-элементов ):

def IsString(item):    
    return isinstance(item,str)
def IsInt(item):
    return isinstance(item,int)

a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings

for e in a:
    if isinstance(a[e],list):
        try:
            a[e].sort()         # inplace sort the lists
        except TypeError:
            str_list = sorted(filter(IsString,a[e]))
            int_list = sorted(filter(IsInt,a[e]))
            a[e] = int_list + str_list # default to numbers before strings

print(a)
0 голосов
/ 18 октября 2018

В общем случае (если ваши значения представляют собой список сопоставимых элементов, например, только цифры), вы можете сделать что-то вроде этого

sorted_dict = {key: sorted(value) for key, value in original_dict.items()}

Если ваши значения представляют собой одиночные числа / строки,Вы должны изменить sorted(value) на sorted(value) if isinstance(value, list) else value.(спасибо пользователю @DeepSpace за указание).

Однако приведенный вами пример недействителен, если только a и c не относятся к целочисленным значениям.

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