【问题标题】:Pattern for finding maximum match in ordered-important list在有序重要列表中查找最大匹配的模式
【发布时间】:2015-05-29 11:47:06
【问题描述】:

我注意到我的项目中有一些重复出现的代码,包括找到与列表中某项内容的“最佳匹配”,重要的警告是,如果出现平局,则选择第一个,即顺序很重要。

项目是python,模式看起来像

things = <list of things>

highest_thing = None
highest_strength = 0

for thing in things:
    if thing.strength(some_params) > highest_strength:
        highest_thing = thing
        highest_strength = thing.strength(some_params)

我尝试使用内置的max 函数来执行此操作,使用字典推导来进行从thing 到其strength 的映射,但是字典丢失了顺序。然后我在 Python 中找到了 OrderedDict,但考虑到原始解决方案非常简单,尽管看起来很像 C,但我觉得这比预想的要复杂得多。

理想情况下,我想要类似的东西

highest_thing = highest(things, some_params)

不必自己编写这个函数(这很好,但我不禁认为有一个更好看的解决方案)。

【问题讨论】:

    标签: python design-patterns


    【解决方案1】:

    您确实需要使用max() 函数,但不需要使用字典。

    使用key 参数计算highest_strength 值,max() 应根据该值选择最高值:

    highest_thing = max(things, key=lambda thing: thing.strength(some_params))
    

    【讨论】:

    • max 是否保证返回最高值中的第一个? this question 似乎暗示它在规范中没有得到很好的定义。 sort 不过是稳定的,理论上我可以这样做,但这更令人费解。
    • @Gage: max(),就像sorted() 一样稳定,因为它总是在给定相同输入的情况下选择特定值。如果出现平局,实现会选择第一个最高值;我想它也可以选择最后一个,但没有令人信服的理由来改变它。
    • @Gage:例如见this post on Byte; Tim Peters 是核心 Python 开发人员,他创建了用于 Python(现在也用于 Java 和其他语言)的 Tim Sort 算法。
    • @Gage:如果这对所有 Python 变体都很重要,那么您应该测试所有这些变体或坚持手动循环。
    • 由于我的尝试破坏了我的单元测试,我想我会让测试抓住它们。如果项目最终在具有不同实现的系统上结束,它显然会通过一些测试。谢谢马丁。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2013-09-03
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多