python - 在 Python 字典中找到最大的键

标签 python dictionary

一般:

我需要帮助找到一种在 python 中获取多维 python 字典中的最大 N 项的方法。例如:

 things = {
          "car": { "weight": 100 },
          "apple": { "weight": 1 },
          "spanner": { "weight": 10 } 
          }

在这种情况下,我想找到字典中权重最高的 2 个项目,特别是这些项目的键。所以在这种情况下,它应该返回 ["car", "spanner"]

实际问题:

注意:这是我第一次尝试遗传算法,所以我可能做错了。完全没有。

因为我是英国人,所以我正在寻找我能想象到的最好喝的茶,所以我正在编写一个 python 程序,它随机生成 10 杯茶,然后使用自然选择在这 10 杯中找到前 5 杯,依此类推上。

一杯茶被建模为 python 字典,有 5 个键:

{
 "brew_time": Some Number,
 "milk": Some Number,
 "sweeteners": Some Number,
 "fitness": Some Number (This is what I'm interested in),
 "name": Some randomly generated name (Doesn't really matter)
}

我的程序吐出的一杯茶看起来像这样:

{'brew_time': 2.0, 'milk': 0.5, 'sweeteners': 3.0, 'name': 'bold cup', 'fitness': 0}

然后生成 10 杯茶,存储在 teas 变量中。这是一个输出示例:

{0: {'brew_time': 2.0, 'milk': 0.4, 'sweeteners': 1.0, 'name': 'unafraid brew', 'fitness': 0}, 1: {'brew_time': 3.0, 'milk': 0.5, 'sweeteners': 3.0, 'name': 'fire-eating blend', 'fitness': 0}, 2: {'brew_time': 2.0, 'milk': 0.6, 'sweeteners': 2.0, 'name': 'fearless drink', 'fitness': 0}, 3: {'brew_time': 2.0, 'milk': 0.9, 'sweeteners': 3.0, 'name': 'fire-eating blend', 'fitness': 0}, 4: {'brew_time': 2.0, 'milk': 0.8, 'sweeteners': 2.0, 'name': 'fire-eating cuppa', 'fitness': 0}, 5: {'brew_time': 3.0, 'milk': 0.3, 'sweeteners': 1.0, 'name': 'fire-eating drink', 'fitness': 0}, 6: {'brew_time': 4.0, 'milk': 0.7, 'sweeteners': 2.0, 'name': 'dauntless medley', 'fitness': 0}, 7: {'brew_time': 3.0, 'milk': 0.3, 'sweeteners': 2.0, 'name': 'dauntless cuppa', 'fitness': 0}, 8: {'brew_time': 3.0, 'milk': 0.9, 'sweeteners': 2.0, 'name': 'epic drink', 'fitness': 0}, 9: {'brew_time': 2.0, 'milk': 0.4, 'sweeteners': 2.0, 'name': 'gusty drink', 'fitness': 0}}

我现在正在尝试编写一个名为 selection() 的函数,它将从字典中删除 5 种最不适合的茶。 (我使用 rank_tea() 函数设置茶的适合度,该函数接受一个数组并设置所有茶的适合度,这是一个介于 0 - 1 之间的数字,代表茶的质量茶)

这是我到目前为止所得到的,但它不起作用:

def selection():
    teaCopy = teas.copy()
    fitnesses = []
    for i in range(0, len(teaCopy)):
        fitnesses.append(teas[i]["fitness"])

    print(fitnesses)

    max_fitnesses_indicies = sorted(range(len(fitnesses)), key=lambda x: fitnesses[x])
    print(max_fitnesses_indicies)

    len_array = []
    print(len_array)
    for i in range(0, len(teas)):
        len_array.append(i)

    to_be_del = list( set(max_fitnesses_indicies) - set(len_array) )
    print(to_be_del)

This is the full code.抱歉问题太长了,我只是不想错过任何东西。

任何帮助将不胜感激

最佳答案

您可以简单地使用:

>>> sorted(things.keys(),key=lambda x:things[x]['weight'],reverse=True)
['car', 'spanner', 'apple']

获取按重量排序的项目列表(此处以相反的顺序排列,以便首先对较重的事物进行排序)。所以如果你打电话:

>>> sorted(things.keys(),key=lambda x:things[x]['weight'],reverse=True)[:2]
['car', 'spanner']

你得到最重的两个。但这将O(n log n) 内运行。如果您希望获得的k数量较小(与总数相比)。您可以使用 heapq:

from heapq import nlargest

result = nlargest(k,things.keys(),key=lambda x:things[x]['weight'])

这将 - 据我所知 - O(n log k) 中运行(k 您想要选择)。

关于python - 在 Python 字典中找到最大的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42352887/

相关文章:

python - 逗号分隔的字符串到 Python 2 中的变量

带有过期键的 Java 基于时间的映射/缓存

javascript - 如何使用 JavaScript 中的 DOM 操作函数将 <map> 元素添加到文档中?

python - 如何在 Python3 中发送带有样式的电子邮件?

python - 在 Pandas 数据框中将两个公共(public)行的值分组为一个

python - 接收到str/int错误,无法理解原因

即使键在字典中,Python 也会引发 KeyError(对于字典键外的键)

python - 从 python 中的字典系列中选择不同的键及其计数

python - Pandas Dataframe 创建一个独特的列

python - 检测 OS X 中挂起的 python shell