在Python字典中查找最大的密钥

Oll*_*ton 5 python dictionary

一般:

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

 things = {
          "car": { "weight": 100 },
          "apple": { "weight": 1 },
          "spanner": { "weight": 10 } 
          }
Run Code Online (Sandbox Code Playgroud)

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

实际问题:

注意:这是我对遗传算法的第一次尝试,所以我可能没有正确地做到这一点.完全没有.

因为我是英国人,我正在寻找我能想象到的最好的一杯茶,所以我正在写一个蟒蛇程序,可以产生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)
}
Run Code Online (Sandbox Code Playgroud)

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

{'brew_time': 2.0, 'milk': 0.5, 'sweeteners': 3.0, 'name': 'bold cup', 'fitness': 0}
Run Code Online (Sandbox Code Playgroud)

然后它产生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}}
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试编写一个名为的函数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)
Run Code Online (Sandbox Code Playgroud)

这是完整的代码.对不起问题的长度,我只是不想错过任何东西.

任何帮助,将不胜感激

Wil*_*sem 2

您可以简单地使用:

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

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

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

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

from heapq import nlargest

result = nlargest(k,things.keys(),key=lambda x:things[x]['weight'])
Run Code Online (Sandbox Code Playgroud)

据我所知,这将在O(n log k)中运行k 是你想要选择的项目的数量)。

  • @PeterWood 根据“%timeit”,Willem 的表达式在 100 项列表上的运行速度比您的快约 20%。 (2认同)