从列表中删除与另一个列表中最大值不对应的项。

3
model_names = ['is1', 'is5', 'is10', 'im1', 'im5', 'im10']

作为一个例子,
models = [0.1, 0.2, 0.1, 0.3, 0.2, 0.3]

列表中的最大值是0.3,对应的模型名称为“im1”和“im10”。我想要这个函数。
dominant_model(models)

要返回

['im1', 'im10']

即最“占主导地位”的模型。


以下是我的代码,实现了该功能,但我想知道是否有更短的方法来完成同样的事情,而不需要所有条件语句:

def dominant_model(models):
    m = max(models)
    dom_models = [i for i,j in enumerate(models) if j==m]
    for i in range(len(dom_models)):
        if dom_models[i]==0:
            dom_models[i]=model_names[0]
        elif dom_models[i]==1:
            dom_models[i]=model_names[1]
        elif dom_models[i]==2:
            dom_models[i]=model_names[2]
        elif dom_models[i]==3:
            dom_models[i]=model_names[3]
        elif dom_models[i]==4:
            dom_models[i]=model_names[4]
        elif dom_models[i]==5:
            dom_models[i]=model_names[5]
    return dom_models 
2个回答

9

找到最大值m = max(model)后,将模型名称与值进行配对,并取出值等于m的名称。

def dominant(names, values):
    m = max(values)
    return [name for name, value in zip(names, values) if value == m]

演示


>>> model_names = ['is1', 'is5', 'is10', 'im1', 'im5', 'im10']
>>> model_values = [0.1, 0.2, 0.1, 0.3, 0.2, 0.3]
>>> dominant(model_names, model_values)
['im1', 'im10']

1
这真的非常优雅。 - Matias Cicero

0
使用两个循环:
def dominant_model(models):
    m = max(models)
    dom_models = [i for i,j in enumerate(models) if j==m]
    for i in range(len(dom_models)):
        for j in range(6):
            if dom_models[i]==j:
                dom_models[i]=model_names[j]
    return dom_models 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接