从字典中删除最小的元素

Remove the smallest element(s) from a dictionary

我有一个函数,其中有一个字典作为参数,关联的值是一个整数。我正在尝试删除最少的元素和 return 一组剩余的键。

我正在 python 编程。我似乎无法删除具有相同键或值的键值对。我的代码不适用于第二个和第三个示例 这就是它的工作原理:

remaining({A: 1, B: 2, C: 2})
{B, C}

remaining({B: 2, C : 2})
{}
remaining({A: 1, B: 1, C: 1, D: 4})
{D}

这是我的:

def remaining(d : {str:int}) -> {str}:
    Remaining = set(d)
    Remaining.remove(min(d, key=d.get))
    return Remaining

那是因为您正在尝试将值映射到键,而映射允许不同的键具有相同的值,但反之则不行!您应该按照 here 所述实现一个映射 "reversal",删除最小键,然后将映射反转回其原始形式。

from collections import defaultdict

# your example
l = {'A': 1, 'B': 1, 'C': 1, 'D': 4}

# reverse the dict
d1 = {}
for k, v in l.iteritems():
    d1[v] = d1.get(v, []) + [k]

# remove the min element
del d1[min(d1, key=d1.get)]

#recover the rest to the original dict minus the min
res = {}
for k, v in d1.iteritems():
    for e in v:
        res[e] = k

print res

评论:
@Jon Clements 的解决方案更优雅,应该被接受为答案

一种方法是取最小值,然后构建一个与其相等的键列表,并利用具有类似集合行为的 dict.viewkeys() 并从中删除与最小值匹配的键。

d = {'A': 1, 'B': 1, 'C': 1, 'D': 4}

# Use .values() and .keys() and .items() for Python 3.x
min_val = min(d.itervalues())
remaining = d.viewkeys() - (k for k, v in d.iteritems() if v == min_val)
# set(['D'])

顺便说一句,我觉得 {B: 2, C : 2} 应该是 {} 很奇怪,因为实际上没有什么比这更小的了。

这将删除所有具有最小值的项目。

import copy

def remaining(dic):
    minimum = min([i for i in dic.values()])
    for k, v in copy.copy(dic.items()):
        if v == minimum: dic.pop(k)

    return set(dic.keys())

取最小值并用所有与该值无关的键构造一个集合:

def remaining(d):
    m = min(d.values())
    return {k for k,v in d.items() if v != m}

如果你不喜欢集合推导式,那就是:

def remaining(d):
    m = min(d.values())
    s = set()
    for k,v in d.items():
        if v != m:
            s.add(k)
    return s

更简单的方法是使用 pd.Series.idxmin() 或 pd.Series.min()。这些函数允许您找到最小值或系列中的最小值的索引,加上 pandas 允许您创建命名索引。

import pandas as pd
import numpy as np
A = pd.Series(np.full(shape=5,fill_value=0))#create series of 0
A = A.reindex(['a','b','c','d','e'])#set index, similar to dictionary names
A['a'] = 2
print(A.max())
#output 2.0
print(A.idxmax())#you can also pop by index without changing other indices
#output a