Python – 如何针对值测试多个变量?

我正在尝试创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成Python。所以说:

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

这将返回一个列表

["c", "d", "f"]

这样的事情可能吗?


你误解了布尔表达式的工作原理; 他们不像英语句子一样工作,并猜测你在谈论所有名字的相同比较。您正在寻找:

if x == 1 or y == 1 or z == 1:

xy以其他方式自行评估(False如果0True否则)。

您可以使用针对元组的包含测试来缩短它:

if 1 in (x, y, z):

或者更好的是:

if 1 in {x, y, z}:

使用aset来利用常量成本隶属度测试(in无论左手操作数是多少,都需要一定的时间)。

使用时or,python将运算符的每一侧视为单独的表达式。表达式x or y == 1首先被视为布尔测试x,如果为False,y == 1则测试表达式。

这是由于运营商的优先权。的or操作者具有比较低的优先级==的测试,因此后者被评估第一

但是,即使不是这种情况,并且表达式x or y or z == 1实际上被解释为(x or y or z) == 1相反,这仍然不会按照您的预期执行。

x or y or z将评估为’truthy’的第一个参数,例如not False,numeric 0或empty(有关Python在布尔上下文中认为false的详细信息,请参阅布尔表达式)。

因此对于值x = 2; y = 1; z = 0x or y or z将解析为2,因为这是参数中第一个类似真值的值。那2 == 1就是False,即使y == 1True

这同样适用于逆; 针对单个变量测试多个值; x == 1 or 2 or 3因为同样的原因会失败。使用x == 1 or x == 2 or x == 3x in {1, 2, 3}


使用字典结构更容易解决您的问题:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]

以前的解决方案:正如Martijn Pieters所说,正确且最快的格式是:

if 1 in {x, y, z}:

似乎没有解决的一个主要问题是您希望输出列表在真正的if语句后包含每个字母。

仅使用Martijn Pieters的建议,您现在可以:

if 0 in {x, y, z}:
    Mylist.append("c")
elif 1 in {x, y, z}:
    Mylist.append("d")
...

问题:第一个if语句将返回true,并且您永远不会得到以下elif语句。所以你的清单会简单地返回:

["c"]

你想要的是拥有单独的if语句,以便python将读取每个语句,无论前者是真还是假。如:

if 0 in {x, y, z}:
    Mylist.append("c")
if 1 in {x, y, z}:
    Mylist.append("d")
if 2 in {x, y, z}:
    Mylist.append("e")
...

这样可以工作,但是“如果”你习惯使用字典(看我在那里做了什么),你可以通过制作一个初始字典将数字映射到你想要的字母来清理它,然后只使用’for’循环:

numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
    if number in {x, y, z}:
        Mylist.append(numToLetters[number])

添加评论

友情链接:蝴蝶教程