从字典中删除最小的元素
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
我有一个函数,其中有一个字典作为参数,关联的值是一个整数。我正在尝试删除最少的元素和 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