如何确定从列表中返回对象的优先级

atr*_*ona 0 python

我有一个返回布尔值的对象列表,如下所示

badges = [{"is_staff": self.sender.is_staff},
                  {"is_vendor": self.sender.is_vendor}, {"is_trader": self.sender.is_trader}]

# or we can write this like that; 
badges = [{"is_staff": True}, {"is_vendor": False}, {"is_trader": True}]
Run Code Online (Sandbox Code Playgroud)

我想以这个优先级返回用户徽章;is_staff 具有最高优先级,然后是供应商,然后是交易者。

如果用户拥有所有徽章,那么我只想将 is_staff 的徽章作为字符串值返回到 = 'staff',因为它具有最高优先级。

喜欢

badge = 'staff'
Run Code Online (Sandbox Code Playgroud)

我有这个功能可以使用。但没有找到返回我想要的值的方法。

@property
def badge(self):
    "Returns the user's designation if the user is Staff, Vendor, Trader."
    badges = [{"is_staff": self.sender.is_staff},
              {"is_vendor": self.sender.is_vendor}, {"is_trader": self.sender.is_trader}]
    badge = ''
    # need help there to find the value on the basis of badges 
    return badge
Run Code Online (Sandbox Code Playgroud)

Sam*_*ord 5

不要使用不必要的笨重的字典列表,而是将您的跟踪badges作为将每个徽章名称映射到其值的字典。

在 Python 3 中,字典根据您定义键的方式保留顺序,因此您可以按优先级顺序定义键:

>>> badges = {"staff": False, "vendor": True, "trader": True}
Run Code Online (Sandbox Code Playgroud)

然后只需选择第一个具有真实值的键:

>>> next(b for b, v in badges.items() if v)
'vendor'
Run Code Online (Sandbox Code Playgroud)