Как отсортировать ключи в словаре, игнорируя указанные c символов? - PullRequest
1 голос
/ 11 марта 2020

У меня есть словарь, подобный следующему:

>>> dictionary = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}

Я хочу отсортировать его по ключам без изменения позиции "", чтобы он мог выглядеть следующим образом:

>>> dictionary
{34: "martsz", 63: "Daniel", "": "Kathy", 79: "David"}

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

начиная с python3 .6 словари упорядочены по вставке, поэтому, если у вас python версия> = 3.6, вы можете использовать:

dictionary = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}

i = next(i for i, e in enumerate(dictionary) if e == "")

idx = sorted(e for e in dictionary if e != "")
idx.insert(i, "")
dictionary = {e: dictionary[e] for e in idx}
dictionary

вывод:

{34: 'martsz', 63: 'Daniel', '': 'Kathy', 79: 'David'}

для других python версий, которые вы можете использовать OrderedDict

1 голос
/ 11 марта 2020

Решение

Используется collections.OrderedDict.

Краткий ответ

Вы можете использовать следующие функции и использовать OrderedDict.

from collections import OrderedDict

d = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}
d = OrderedDict(**d)
get_sorted_dict(d, target_key='')

Вывод :

OrderedDict([('34', 'martsz'),
             ('63', 'Daniel'),
             ('', 'Kathy'),
             ('79', 'David')])

Длинный ответ

Сюда входят пользовательские функции.

from collections import OrderedDict

def get_sorted_keys(keys, target_key='') -> list:
    """Returns a list of sorted keys with 
       index of target_key kept unchanged.
    """
    keys = [str(k) for k in keys]
    sorted_keys = sorted(keys)
    sorted_keys.pop(sorted_keys.index(''))
    target_key_index = keys.index(target_key)
    sorted_keys.insert(target_key_index, target_key)
    return sorted_keys

def get_sorted_dict(d:dict, target_key='') -> OrderedDict:
    """Returns a dictionary sorted by the keys, while 
       keeping the index of the target_key unchanged.

    """
    sorted_keys = get_sorted_keys(keys = d.keys(), 
                                  target_key = target_key)
    sorted_dict = OrderedDict()
    for k in sorted_keys:
        temp = {k: d.get(int(k))} if not (k==target_key) else {k: d.get(k)}        
        sorted_dict.update(temp.copy())
    return sorted_dict  

##----------------- Implementation ------------------
d = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}
d = OrderedDict(**d)
get_sorted_dict(d, target_key='')
...