在字典中查找最小非零值(Python)

时间:2018-09-04 10:26:06

标签: python python-3.x dictionary min

我有一个字典,我想获取其值为最小非零值的键。

例如输入以下信息:

{1:0, 2:1, 3:2}

它将返回2。

5 个答案:

答案 0 :(得分:5)

您可以进行一个迭代。

d = {1:0, 2:1, 3:2}

# Save the minimum value and the key that belongs to it as we go
min_val = None
result = None
for k, v in d.items():
    if v and (min_val is None or v < min_val):
        min_val = v
        result = k

print(result)

一些假设:

  • 将考虑负值
  • 它将返回找到的第一个键
  • 如果有帮助,min_val将保留最小值

答案 1 :(得分:4)

您可以使用事实0被视为False来过滤出0值。然后将next与生成器表达式一起使用:

d = {1:0, 2:1, 3:2}

val = min(filter(None, d.values()))
res = next(k for k, v in d.items() if v == val)  # 2

在重复键为1的情况下,这只会返回一个键。对于多个匹配项,您可以使用列表推导:

res = [k for k, v in d.items() if v == val]

请注意,您的文字要求“最小非零”会包含为负值。

性能说明

上面的解决方案是2次通过,但是具有时间复杂度O( n ),不可能具有比这更低的 复杂度。如@Maor所示,可以进行1遍O( n )解决方案,但这不一定更有效:

# Python 3.6.0

%timeit jpp(d)  # 43.9 ms per loop
%timeit mao(d)  # 98.8 ms per loop
%timeit jon(d)  # 183 ms per loop
%timeit reu(d)  # 303 ms per loop

用于基准测试的代码

from random import randint

n = 10**6
d = {i: randint(0, 9) for i in range(n)}

def jpp(d):
    val = min(filter(None, d.values()))
    return next(k for k, v in d.items() if v == val)

def mao(d):
    min_val = None
    result = None
    for k, v in d.items():
        if v and (min_val is None or v < min_val):
            min_val = v
            result = k
    return result

def jon(d):
    return min({i for i in d if d[i] != 0})

def reu(d):
    no_zeros = {k: v for k, v in d.items() if v != 0}
    key, val = min(no_zeros.items(), key=itemgetter(1))
    return key

答案 2 :(得分:2)

假设dict被命名为a

from operator import itemgetter

a = {1:0, 2:1, 3:2}
# remove zeros
no_zeros = {k: v for k, v in a.items() if v != 0} # can use `if v`
# find minimal key and value (by value)
key, val = min(no_zeros.items(), key=itemgetter(1))
# key = 2, val = 1

答案 3 :(得分:1)

print(min(i for i in dictionary if  dictionary[i] != 0))

这将创建一个没有零的集合,并返回该集合中的最小值。尽管值得指出,这需要进行两次迭代,因此比Maor Refaeli的解决方案要慢。

答案 4 :(得分:0)

解决方案

some_dict = {1:0, 2:1, 3:2}
compare = []

for k, v in some_dict.items():
    if k != 0:
        compare.append(k)

x = min(compare)

print(x)

我只是将所有非零的appended keys listcompare)上,然后应用min(compare)

我们可以重新插入x并检查它是否指向键1,它是最小的非零key并返回它的value 0

>>> print(some_dict[x]) 
>>> 0