从字典中删除最小的元素

时间:2015-01-18 19:00:59

标签: python dictionary set minimum

我有一个函数,有一个字典作为参数,其值与一个整数相关联。我正在尝试删除最小元素并返回一组剩余的键。

我在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

5 个答案:

答案 0 :(得分:2)

一种方法是获取最小值,然后构建一个与其相等的键列表,并使用具有类似行为的行为的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}应该是{},因为实际上并不是那么大的最小值。

答案 1 :(得分:0)

那是因为您尝试将值映射到键和地图允许不同的键具有相同的值而不是其他方式!你应该实施一个地图"逆转"如上所述here,删除最小键,然后将地图反转回原始形式。

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的解决方案更优雅,应该被接受为答案

答案 2 :(得分:0)

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

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())

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

一种更简单的方法是使用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