从python字典中删除最小的N值

时间:2019-04-18 20:19:52

标签: python dictionary

假设我有以下字典:

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 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

您可以使用

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将通过这种方法进行更改。