假设我有一个偏好降序列表:
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
循环?
将max
与自定义key
一起使用:
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
这是两行,但它应该有效:
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))