Предположим, у меня есть следующий словарь:

d = {'q' : 2,
     'b': 22,
     'c': 19,
     'e': 3,
     'd': 9}

Что я хочу сделать, это итеративно удалить наименьшие значения (с их ключами) из словаря. Например, если я хочу удалить 2 наименьших значения, я ожидаю получить следующее как оставшийся словарь:

d = {'b': 22,
     'c': 19,
     'd': 9}

Обратите внимание, что в этом случае порядок имеет значение для меня. То есть элементы в исходном словаре НЕ должны переупорядочиваться после обработки.

Я попробовал приведенный ниже код, но он не работает для примера, где длина dict равна 19, и мне нужно удалить 18 наименьших значений (с соответствующими ключами).

def remaining(dict, smallest_n):
    remaining = dict
    s = {}
    for i in range(smallest_n-1):
        m = min(remaining.values())
        for k, v in remaining.items():
            if v != m:
                s[k] = v
        remaining = s.copy()
        s.clear()

    return remaining

Для случая, который я упомянул выше, когда smallest_n (то есть количество минимальных элементов, которые должны быть удалены) равняется 18, а размер входного словаря равен 19, то, что я получаю как остальное, должно иметь размер 1 (19 -18 ) . Однако он не содержит ничего после выполнения строк кода.

2
inverted_index 18 Апр 2019 в 23:19

2 ответа

Лучший ответ
min_key = min(d.keys(), key=lambda k: d[k])
del d[min_key]

Это удалит запись с минимальным значением. Сделайте это в цикле, если вы хотите удалить несколько.

Как функция:

def remove_n_minimums(d, n):
    for _ in range(n):
        min_key = min(d.keys(), key=lambda k: d[k])
        del d[min_key]
2
Tom Lubenow 18 Апр 2019 в 20:32

Вы могли бы использовать

def remove(some_dict, smallest_n = 0):
    # nothing to do
    if not smallest_n:
        return some_dict

    keys_tuple = sorted(
        [(v, k) for k,v in some_dict.items()],
        key = lambda x: x[0]
    )
    for x in range(smallest_n):
        key = keys_tuple[x][1]
        del some_dict[key]

    return some_dict

remove(d, 2)
# {'b': 22, 'c': 19, 'd': 9}

Мы строим список кортежей с ключами и значениями. Список будет отсортирован, а соответствующие ключи будут впоследствии удалены. Исходный dict будет изменен с этим подходом.

1
Jan 18 Апр 2019 в 20:38