从列表中选择优先级项目



假设我有一个偏好降序列表:

person_choice = ['amy', 'bob', 'chad', 'dan', 'emily']

意思是,amy优先于bob,谁优先于chad等等。

我还有几个这样的列表(名称没有特定的顺序和列表长度):

group1 = ['joyce', 'amy', 'emily', 'karen', 'rebecca']
group2 = ['chad', 'kyle', 'michael', 'neo', 'bob']
...

在每个group1group2中,我想选择此列表中出现在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))

相关内容

最新更新