假设我有一个按偏好排序的降序列表:
person_choice = ['amy', 'bob', 'chad', 'dan', 'emily']这意味着,amy比bob更好,而chad则更好,依此类推。
我还有两个类似的列表(名称没有特定的顺序和列表长度):
group1 = ['joyce', 'amy', 'emily', 'karen', 'rebecca']
group2 = ['chad', 'kyle', 'michael', 'neo', 'bob']
...在每个group1和group2中,我想选择此列表中显示在person_choice中具有最高首选项的人员。因此,预期输出如下所示:
group1_choice = 'amy'
group2_choice = 'bob'假设对于每个groupX,至少有一个人出现在person_choice中,那么在Python语言中有没有一行程序可以在没有复杂的for循环的情况下做到这一点呢?
发布于 2021-11-05 20:38:42
在自定义key中使用max
person_choice = ['amy', 'bob', 'chad', 'dan', 'emily']
group1 = ['joyce', 'amy', 'emily', 'karen', 'rebecca']
group2 = ['chad', 'kyle', 'michael', 'neo', 'bob']
def choice(group):
return max(group, key=lambda name: -person_choice.index(name) if name in person_choice else float('-inf'))
print(choice(group1))
print(choice(group2))结果:
amy
bob发布于 2021-11-05 20:37:30
这是两行代码,但它应该可以工作:
ranks = {
person: i
for i, person in enumerate(reversed(person_choice))
}
max(
group1,
key=lambda x: ranks.get(x, -1)
)从本质上讲,我们将排名放入字典中,以便快速查找。然后,我们可以使用Python的min来搜索我们的优先项。在本例中,我颠倒了列表并使用了max,因此-1可以用作不在列表中的人的优先级。
下面是它在上下文中可能的样子:
group1 = ['joyce', 'amy', 'emily', 'karen', 'rebecca']
group2 = ['chad', 'kyle', 'michael', 'neo', 'bob']
person_choice = ['amy', 'bob', 'chad', 'dan', 'emily']
ranks = {
person: i
for i, person in enumerate(reversed(person_choice))
}
def group_choice(group, ranks):
return max(
group,
key=lambda x: ranks.get(x, -1)
)
print(group_choice(group1, ranks))
print(group_choice(group2, ranks))https://stackoverflow.com/questions/69858906
复制相似问题