在字典中查找最小的条目,取而代之的是获取最后一个键值对

Eri*_*erc 0 python dictionary

我的教科书要求我编写一个函数,将单个字典作为输入并返回最不可能被观察到的粒子,其中键是粒子名称,值是该粒子被观察到的概率。这是字典:

parts_to_probs = {'proton': 0.21, 'meson': 0.03, 'muon': 0.07, 'neutron': 0.55}
Run Code Online (Sandbox Code Playgroud)

这是我的文档字符串函数:

def least_likely(parts_to_probs: dict) -> str:
    """Return the particle from parts_to_probs that is least probable to be
    observed.

    >>> least_likely({'proton': 0.21, 'meson': 0.03, 'muon': 0.07, 'neutron': 0.55}) 

    ('meson', 0.03)
    """

    smallest = 1
    name = ''

    for particle in parts_to_probs:           
        probability = parts_to_probs[particle] 
        if probability < smallest:
            smallest = probability
            name = particle

    return (particle, probability)

print(least_likely(parts_to_probs))
Run Code Online (Sandbox Code Playgroud)

现在当我运行这个程序时,它总是从字典中打印出最后一个键/值对,不管它是否具有最小的概率。我真的不确定我必须改变什么,因为 for 循环应该在第二个循环之后停止。

由于 'muon' 的概率为 0.07,所以概率不会 < 最小(第二次循环后为 0.03)。

Mar*_*ers 5

您正在返回最后一个粒子和概率,而不是 smallestname

return (particle, probability)
Run Code Online (Sandbox Code Playgroud)

particle并且probability是从你的循环变量:

for particle in parts_to_probs:
    probability = parts_to_probs[particle]
Run Code Online (Sandbox Code Playgroud)

并且在循环结束时不会清除particleprobability变量for(Python 没有块作用域,变量存在于函数的持续时间内)。

您的循环体正确更新smallestname变量,因此返回这些值

return (name, smallest)
Run Code Online (Sandbox Code Playgroud)

修正后的函数:

def least_likely(parts_to_probs: dict) -> str:
    """Return the particle from parts_to_probs that is least probable to be
    observed.

    >>> least_likely({'proton': 0.21, 'meson': 0.03, 'muon': 0.07, 'neutron': 0.55}) 

    ('meson', 0.03)
    """

    smallest = 1
    name = ''

    for particle in parts_to_probs:           
        probability = parts_to_probs[particle] 
        if probability < smallest:
            smallest = probability
            name = particle

    return (name, smallest)
Run Code Online (Sandbox Code Playgroud)

你可能会进一步学习一些东西:

  • 在您使用的地方for particle in parts_to_probs:,您正在迭代字典。您还遍历能项目,或键值对,用dict.items()的方法。这为您节省了单独的probability = parts_to_probs[particle]语句:

    for particle, probability in parts_to_probs.items():
    
    Run Code Online (Sandbox Code Playgroud)
  • 内置min()函数也可以完成您的函数正在执行的工作,前提是您教它如何将每个键值对与其他键值对进行比较以找到最小的。这就是key函数参数的工作,它与每个项目一起调用,并且您应该返回要在比较中使用的值。使用每(key, value)对元素的第二个元素的函数对此非常lambda pair: pair[1]有用,并且是拼写这样一个函数的紧凑方式:

    min(parts_to_probs.items(), key=lambda pair: pair[1], default=(None, 1))
    
    Run Code Online (Sandbox Code Playgroud)

    但你也可以使用一个operator.itemgetter()对象

    from operator import itemgetter
    min(parts_to_probs.items(), key=itemgetter(1), default=(None, 1))
    
    Run Code Online (Sandbox Code Playgroud)