【问题标题】:Remove the smallest element(s) from a dictionary从字典中删除最小的元素
【发布时间】:2015-03-16 19:19:24
【问题描述】:

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

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

【问题讨论】:

  • 您忘记了编程语言的相关标签。你也忘了提到你的问题是什么,你有错误吗?你被困在哪里了?
  • Python!我坚持删除值相同的键值对。描述中的示例 2 和 3 是我遇到问题的地方

标签: python dictionary set minimum


【解决方案1】:

那是因为您正在尝试将值映射到键,而 map 允许不同的键具有相同的值,但反之则不行!您应该按照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】:

    一种方法是取最小值,然后构建一个与其相等的键列表,并利用具有类似集合行为的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} 应该是 {} 很奇怪,因为实际上并没有什么比这些最小值更大的了。

    【讨论】:

    • [很确定它是注释语法中的 3。]
    • @DSM 我有点掩饰了那一点...不确定{str:int} 看起来是否正确...但到目前为止还没有真正的理由同时使用注释(如果我需要它,文档在那里...)
    【解决方案3】:

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

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

    【讨论】:

    • OP 想要一个 set() ,其中包含所有键,但值最小的键除外。
    • 迭代时不能改变 dict 的大小。 dict.pop() 里面 for 引发 RuntimeError: dictionary changed size during iteration
    • 可以,只是不建议这样做。无论如何我都会复制一份。
    • 它在 Python 2 中有效,因为 dict.items() 是一个列表,但它在 Python 3 中引发了异常,因为 dict.items() 是一个迭代器(类似于 Python 2 中的 dict.iteritems())。
    【解决方案4】:

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

    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
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 2021-04-09
        • 2016-05-06
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多