首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于真/假值的Python优雅赋值

基于真/假值的Python优雅赋值
EN

Stack Overflow用户
提问于 2011-01-18 17:16:58
回答 11查看 6.1K关注 0票数 28

根据三个布尔值的不同,我有一个变量要设置。最直截了当的方式是if语句,然后是一系列的私生子:

代码语言:javascript
复制
if a and b and c:
    name = 'first'
elif a and b and not c:
    name = 'second'
elif a and not b and c:
    name = 'third'
elif a and not b and not c:
    name = 'fourth'
elif not a and b and c:
    name = 'fifth'
elif not a and b and not c:
    name = 'sixth'
elif not a and not b and c:
    name = 'seventh'
elif not a and not b and not c:
    name = 'eighth'

这有点尴尬,我想知道是否有更多的Pythonic方法来处理这个问题。我想到了几个想法。

  1. 字典黑客:

名称= {a和b和c:‘第一’,a和b,而不是c:‘第二’,a而不是b和c:‘第三’,a而不是b,而不是c:‘四’,不是a和b,c:‘第五’,不是a和b,也不是c:‘第六’,不是a而不是b和c:‘第七’,非a,非b,非c:‘第八’}真

我称之为黑客,因为我不太狂野,因为有七个键是假的,而且互相凌驾。

  1. 和/或魔术

名称= (a、b、c、a、b、b、c、c、b、c、a、b、c和第三、a、b、c、4或非a、b、c和非a、b、c和非a、b、c、c、6或非a、b和c或非a、b和c、非a、b、c和‘8’)

这是因为Python和ors返回要计算的最后一个值,但您必须知道这一点,才能理解这段奇怪的代码。

这三种选择都不是很令人满意的。你有什么建议吗?

EN

回答 11

Stack Overflow用户

发布于 2011-01-18 17:22:12

您可以将a、b和c看作三个位,当将它们放在一起时,形成一个介于0到7之间的数字。然后,您可以有一个值的数组'first','second',.“第八”,并将位值用作数组中的偏移量。这将是两行代码(一行将位组装为0-7中的值,另一行用于在数组中查找值)。

下面是代码:

代码语言:javascript
复制
nth = ['eighth', 'seventh', 'sixth', 'fifth', 'fourth', 'third', 'second', 'first']
nth[(a and 4 or 0) | (b and 2 or 0) | (c and 1 or 0)]
票数 50
EN

Stack Overflow用户

发布于 2011-01-18 17:20:57

用个白痴怎么样?

代码语言:javascript
复制
name = {(True, True, True): "first", (True, True, False): "second",
        (True, False, True): "third", (True, False, False): "fourth",
        (False, True, True): "fifth", (False, True, False): "sixth",
        (False, False, True): "seventh", (False, False, False): "eighth"}

print name[a,b,c] # prints "fifth" if a==False, b==True, c==True etc.
票数 29
EN

Stack Overflow用户

发布于 2011-01-18 17:22:27

也许没什么更好的,但是

代码语言:javascript
复制
results = ['first', 'second', 'third', 'fourth', 
           'fifth', 'sixth', 'seventh', 'eighth']
name = results[((not a) << 2) + ((not b) << 1) + (not c)]
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4726949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档