<p>只需使用<code>max()</code>并传递<code>no_of_languages/cost</code>作为键。如果名称是数据的一部分,而不是变量名,那就更容易了。但如果需要处理索引,可以枚举列表并返回正确的索引:</p>
<pre><code>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
</code></pre>
<p>在数据中包含名称并使用类似于<code>namedtuple</code>的内容可以极大地提高代码的可读性:</p>
<pre><code>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)
</code></pre>
<p>根据@Vasus devon提到的内容编辑:</p>
<p>您可以在交集操作符<code>&</code>中找到项目的连接和使用python集合的技巧。要找到最佳匹配,只需计算与项目相交的技能,就可以计算</p>
<pre><code>set(project) & set(candidate.languages)
</code></pre>
<p>计算得出:</p>
<pre><code>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)
</code></pre>
<p>结果:</p>
<pre><code>Candidate(name='jess', languages=['php', 'java'], cost=200)
</code></pre>