有没有办法从一张单子里找出最好的一个人,然后把它加到单子上?

2024-03-28 10:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个名单,其中我有几个人与编程技能和他们的现行利率。我现在处于困境,因为我正试图从名单中找到最好的个人大约,根据他们的技能涵盖每一美元。我应该用什么算法来评估孤立的个体?你知道吗

我一直试图让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)))

预期(产出)必须是每一美元拥有最多技能的人。返回值必须是列表中人员的位置整数。你知道吗

例如

0 - 4

Tags: ofthenameinprojectforlen技能
2条回答

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

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, 我想在这里补充一点,我认为你的问题中遗漏了这一点。它需要寻找作为项目一部分的技能。如果应聘者拥有的任何技能不属于这一部分,就必须打折扣。 我试着写些有用的东西那个。作为他指出,单独使用候选名称而不是变量名称可能是值得的。你知道吗

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

相关问题 更多 >