Мне нужно переупорядочить очень большой OrderedDict по первому «CSV» его ключей. Например, у меня есть такой словарь:
a = {'40,70': AAAAAA, '0,12': XXXXXXXX, '20,38': YYYYY}
Мне нужно, чтобы он был заказан по первому номеру ключа, который всегда представляет собой два числа, разделенных запятой (мне нужно, чтобы второе число было фактором упорядочения). Ценности или буквы в настоящее время не имеют значения. Мне нужно, чтобы это было так:
b = {'0,12': XXXXXXXX, '20,38': YYYYY, '40,70': AAAAAA}
Словарь слишком велик, чтобы разбивать каждый ключ в цикле. Есть ли более быстрый способ сделать это? Я постарался сделать это как можно более ясным.
Спасибо.
«Словарь слишком велик для разделения каждого ключа в цикле», к сожалению, вам придется выполнять эту операцию с любым ключом сортировки, который вы будете использовать. Так почему бы не использовать кортеж целых чисел в качестве ключа напрямую, чтобы не указывать ключ сортировки
Да, мне нужен OrderedDict, но одно это не поможет. Он не будет располагать элементы только «половиной» ключа.
Вам нужен тай-брейк, если первые числа равны? это требование к памяти неясно
Да, мне нужно, чтобы второй номер был фактором заказа.






вы можете использовать заказанный диктант, чтобы изменить порядок диктовки
from collections import OrderedDict
OrderedDict(sorted(a.items(), key=lambda ele:[int(item) for item in ele[0].split(',')]))
@ Jean-FrançoisFabre меняет названия предметов
map(int,ele[0].split(','))) по-прежнему не совместим с Python 3. map здесь не нужен
@ Jean-FrançoisFabre Я думаю, что карта по-прежнему является ключевым словом для python3
@ Jean-FrançoisFabre Я изменил карту на полный список
намного лучше. Причина, по которой map не работает как ключ сортировки, заключается в том, что он возвращает функцию генератора, а не ожидаемый список. Таким образом, в python 3 не работает предоставление ключа списка
@ Jean-FrançoisFabre ах, я этого не заметил. Спасибо
Со вторым номером в качестве тай-брейка:
ordered_dict = dict(sorted(a.items(), key=lambda x: [int(x[0].split(",")[0]), int(x[0].split(",")[1])]))
не сортируется численно
Использовать OrderedDict
from collections import OrderedDict
a = {'40,70': 'AAAAAA', '0,12': 'XXXXXXXX', '20,38': 'YYYYY'}
b = OrderedDict(sorted(a.items()))
не сортируется численно
Лучшим способом было бы создать ключи tuple в вашем словаре, а затем отсортировать их в естественном порядке.
Если вы хотите сохранить ключи в виде строк, тогда отсортируйте элементы словаря в кортеж, с помощью ключевой функции, преобразующей ключ как кортеж целых чисел. Это обеспечивает тай-брейк в случае, если 2 первых числа равны:
a = {'40,70': "AAAAAA", '0,12': "XXXXXXXX", '0,10': "XXXXXXXX", '20,38': "YYYYY"}
import collections
b = collections.OrderedDict(sorted(a.items(),key = lambda e : tuple(map(int,e[0].split(",")))))
print(b)
результат:
OrderedDict([('0,10', 'XXXXXXXX'), ('0,12', 'XXXXXXXX'), ('20,38', 'YYYYY'), ('40,70', 'AAAAAA')])
Я как раз хотел сказать, что забыл упомянуть, что вторая половина ключа тоже может нуждаться в сортировке. Спасибо
Я думаю, что с помощью OrderedDict вы можете использовать что-то вроде этого. Я не уверен, что это самый быстрый способ.
Для числовой сортировки я предполагал, что перед запятой всегда будет целое число.
Использовать вторую часть как второй ключ и превратить ключ в кортеж.
from collections import OrderedDict
a = {'40,70': 'AAAAAA', '0,12': 'XXXXXXXX', '20,38': 'YYYYY', '0,38': 'AAYY'}
b = OrderedDict(sorted(a.items(), key=lambda x: (int(x[0].split(',')[0]), int(x[0].split(',')[1]))))
print(b)
результат
OrderedDict([('0,12', 'XXXXXXXX'), ('0,38', 'AAYY'), ('20,38', 'YYYYY'), ('40,70', 'AAAAAA')])
добавлен int () для преобразования ключа сортировки в целое число
внесены изменения, чтобы использовать вторую часть клавиш dict в качестве разрешения проблемы
словари не заказываются как минимум до 3.6 или официально до 3.7. Вы хотите
OrderedDict?