Как отсортировать список, который является значением словарей?
Мне нужно отсортировать список, который является значением словарей, используя функцию с меньшими затратами на вычисления. Я не смог бы поделиться исходным кодом, поэтому, пожалуйста, помогите мне со следующим примером.
Я попытался с помощью стандартного подхода, я проанализировал значения, использовал промежуточный список для сортировки и сохранил его в новом словаре, который требует значительных вычислений. Я пытаюсь упорядочить его, для этого я ожидаю каких-либо предложений или способов включения.
вход
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 ответа
Вам не нужно сортировать слова, вам нужно отсортировать все значения, которые являются списками внутри вашего сообщения. Вам не нужно создавать какие-либо новые объекты вообще:
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 Matthias) сравнение между int и nd str дает TypeError - вы можете "исправить" это с помощью некоторых необязательных вычислений (вдохновленных ответами по адресу: /questions/22778243/python-listsort-zapros-kogda-spisok-soderzhit-razlichnyie-tipyi-elementov):
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)
В целом (если ваши значения представляют собой список сопоставимых элементов, например, только цифры), вы можете сделать что-то вроде этого
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
обратитесь к целочисленным значениям.