有没有办法从个人列表中找到最佳个人,然后将其附加到列表中?

Is there a way to find the best individual from a list of individuals and then append that to a list?

我正在建立一个列表,其中有几个具有编程技能和他们的工作效率的人。我目前处于困境,因为我正试图根据每美元所涵盖的技能从该列表中大致找到最佳人选。我应该使用什么算法来评估孤立的个体?

我一直试图让 for 循环迭代,但它没有移动位置。它在只查看第一个单元格后结束。

jess = (["php", "java"], 200)

clark = (["php", "c++", "go"], 1000)

john = (["lua"], 500)

cindy = (["php", "go", "word"], 240)

candidates = [jess, clark, john, cindy]

project = ["php", "java", "c++", "lua", "go"]

def team_of_best_individuals(project, candidates):       

##note that in the list candidates, I tried to divide the number of items in the tuple by the cost, in order to find the skill per dollar

   def team_of_best_individuals(project, candidates):
   skillList = []
   for name in (candidates):
       len(name)
       for skill in name[0]:
            skillList.append(skill)

            if len(skillList) == len(name):
                num_of_skills=len(skillList)
                cost = name[1]
                num_skill_per_dollar = num_of_skills/cost
                return num_skill_per_dollar, candidates[0:4]
print("skill per dollar="+str(team_of_best_individuals(project, candidates)))

预期(输出)必须是每美元涵盖最多技能的人。 return 值必须是列表中人员的位置整数。

例如

0 - 4

您可以只使用 max() 并传递 no_of_languages/cost 作为密钥。如果名称是数据的一部分而不是变量名称,那会更容易。但是如果需要处理索引,可以枚举列表和return正确的索引:

jess = (["php", "java"], 200)    
clark = (["php", "c++", "go"], 1000)
john = (["lua"], 500)
cindy = (["php", "go", "word"], 240)

candidates = [jess, clark, john, cindy]
m = max(enumerate(candidates), key=lambda cand: len(cand[1][0])/cand[1][1])
m[0] # 3 m[1] is the tuple

在数据中包含名称并使用类似 namedtuple 的内容有助于提高代码的可读性:

from collections import namedtuple
Candidate = namedtuple('Candidate', ('name', 'languages', 'cost'))

candidates = [
    Candidate('jess',["php", "java"], 200),
    Candidate('clark', ["php", "c++", "go"], 1000),
    Candidate('john',["lua"], 500),
    Candidate('cindy', ["php", "go", "word"], 240)
]

max(candidates, key=lambda cand: len(cand.languages)/cand.cost)
#Candidate(name='cindy', languages=['php', 'go', 'word'], cost=240)

根据@Vasus-devon的提及进行编辑:

您可以在交集运算符 & 中使用 python 的集合找到项目和技能的交集。要找到与项目相交的仅计数技能的最佳匹配,您可以计算

的长度
set(project) & set(candidate.languages)

计算给出:

from collections import namedtuple
Candidate = namedtuple('Candidate', ('name', 'languages', 'cost'))
project = ["php", "java", "c++", "lua", "go"]

project_set = set(project) # make a set from projects

candidates = [Candidate('jess',["php", "java"], 200),
Candidate('clark', ["php", "c++", "go"], 1000),
Candidate('john',["lua"], 500),
Candidate('cindy', ["php", "go", "word"], 240)
]

# calculate project_set intersected with set(cand.languages)
max(candidates, key=lambda cand: len(project_set & set(cand.languages))/cand.cost)

结果:

Candidate(name='jess', languages=['php', 'java'], cost=200)

漂亮优雅的回答@Mark Meyer, 我想在这里补充一点,我认为您的问题中缺少这一点。它需要寻找作为项目一部分的技能。如果候选人拥有的任何技能不属于此,则必须打折。 我尝试写一些可以做的事情 that.As 他指出单独使用候选名称而不是变量名称可能是值得的。

jess = (["php", "java"], 200)

clark = (["php", "c++", "go"], 1000)

john = (["lua"], 500)

cindy = (["php", "go", "word"], 240)

candidates = [jess, clark, john, cindy]

project = ["php", "java", "c++", "lua", "go"]

def team_of_best_individuals(project, candidates):
    best = ('A', 0)
    for ind, candidate in enumerate(candidates):
        skills = candidate[0]
        skillperdollar = len([skill for skill in skills if skill in project])/candidate[1]
        if skillperdollar > best[1]:
            best = (ind, skillperdollar)
    return best