我试图制作一个函数,将多个变量与一个整数进行比较,并输出一个三个字母的字符串。我想知道是否有办法将其翻译成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"]
也许您需要输出位集的直接公式。
x=0 or y=0 or z=0 is equivalent to x*y*z = 0
x=1 or y=1 or z=1 is equivalent to (x-1)*(y-1)*(z-1)=0
x=2 or y=2 or z=2 is equivalent to (x-2)*(y-2)*(z-2)=0
让我们映射到位:“c”:1“d”:0xb10“e”:0xb 100“f”:0xb1 000
isc的关系(为“c”):
if xyz=0 then isc=1 else isc=0
使用数学if公式https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315
[c] :(xyz=0和isc=1)或((xyz=0和isc=1)或(isc=0))和(isc=0))
[d] :((x-1)(y-1)(z-1)=0且isc=2)或((xyz=0且isd=2)或(isc=0))
...
通过以下逻辑连接这些公式:
逻辑和是方程的平方和逻辑或是方程式的乘积
你会得到一个总方程式求和,你就有了求和的总公式
那么和1是c,和2是d,和4是e,和5是f
在此之后,您可以形成预定义的数组,其中字符串元素的索引将对应于就绪字符串。
array[sum]提供字符串。
我认为这会处理得更好:
my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}
def validate(x, y, z):
for ele in [x, y, z]:
if ele in my_dict.keys():
return my_dict[ele]
输出:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
问题
而测试多个值的模式
>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False
非常易读,在许多情况下都可以使用,但有一个陷阱:
>>> 0 in {True, False}
True
但我们希望
>>> (0 is True) or (0 is False)
False
解决方案
前面表达式的一个概括是基于ytpilai的答案:
>>> any([0 is True, 0 is False])
False
可以写成
>>> any(0 is item for item in (True, False))
False
虽然此表达式返回正确的结果,但其可读性不如第一个表达式:-(
如Martijn Pieters所述,正确且最快的格式是:
if 1 in {x, y, z}:
根据他的建议,您现在可以有单独的if语句,这样Python可以读取每个语句,无论前者是True还是False。例如:
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循环来清理这个问题:
num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
if number in {x, y, z}:
mylist.append(num_to_letters[number])
您误解了布尔表达式的工作原理;它们不像一个英语句子,你猜你说的是这里所有名字的相同比较。您正在查找:
if x == 1 or y == 1 or z == 1:
否则,x和y将单独计算(如果为0,则为False,否则为True)。
您可以对元组使用包含测试来缩短这一时间:
if 1 in (x, y, z):
或者更好:
if 1 in {x, y, z}:
使用集合来利用恒定成本成员资格测试(即,无论左手操作数是什么,都需要固定的时间)。
解释
当您使用或时,python会将运算符的每一面视为单独的表达式。表达式x或y==1首先被视为x的布尔测试,如果为False,则测试表达式y==1。
这是由于运算符优先级。or运算符的优先级低于==测试,因此先对后者求值。
然而,即使情况并非如此,表达式x或y或z==1实际上被解释为(x或y)==1,这仍然无法实现您期望的效果。
x、y或z将计算为“truthy”的第一个参数,例如不是False、数字0或空(有关Python在布尔上下文中视为False的详细信息,请参见布尔表达式)。
对于x=2的值;y=1;z=0,x或y或z将解析为2,因为这是参数中的第一个类真值。那么2==1将为False,即使y==1为True。
反过来也一样;针对单个变量测试多个值;x==1或2或3将因相同原因而失败。在{1,2,3}中使用x==1或x==2或x==3或x。