Вы можете просто использовать 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:
Вы можете найти пересечение проектов и навыка, используя наборы питона в операторе пересечения &
. Чтобы найти лучшее совпадение, считая только навыки, которые пересекаются с проектом, вы можете рассчитать длину
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)