我正在尝试创建一个将多个变量与一个整数进行比较并输出三个字母的字符串的函数。我想知道是否有一种方法可以将其转换为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:
否则将单独评估
x
和y
(如果0
,True
否则。)
您可以针对元组< / a>:
if 1 in (x, y, z):
或更妙的是:
if 1 in {x, y, z}:
使用一个set
恒定成本成员资格测试的优势(in
花费固定的时间量,无论左侧操作数是多少)。
当您使用或时,python会将运算符的每一面视为分开表达式.表达式x或y==1
首先被视为对x
的布尔测试,然后如果它为False,则表达式y==1
已通过测试。
这是由于运算符优先级引起的。 or
运算符的优先级低于==
测试,因此后者的评估首先 。
但是,即使不是 情况,表达式x或y或z==1
实际上也被解释为(x或y或z)== 1
代替,但这仍然无法实现您期望的效果。
x或y或z
会求值第一个"真实的"参数,例如不是False
,数字0或为空(请参见布尔值表达式以获取有关Python在布尔上下文中认为错误的详细信息。
因此对于值x=2;y = 1; z = 0
,x或y或z
将解析为2
,因为这是参数中的第一个真值。然后,即使y==1
为True
,2==1
也会为False
。
反之亦然;针对单个变量测试多个值;
中使用x==1或2或3
会因相同的原因而失败。在{1、2、3} x==1或x==2或x==3
或x.
使用以下字典结构可以更轻松地解决您的问题:
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语句,以便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])
写x或y或z==0
的直接方法是
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
但是我不认为,您喜欢它。 :)这种方式很难看。
另一种方法(更好)是:
0 in (x, y, z)
BTW很多if
可以这样写
my_cases = {
0: Mylist.append("c"),
1: Mylist.append("d")
# ..
}
for key in my_cases:
if key in (x,y,z):
my_cases[key]()
break
如果您非常懒惰,可以将值放在数组中。如
list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
for obj in list:
if obj == num[index]:
MyList.append(letters[index])
break
您还可以将数字和字母放入字典中并执行此操作,但这可能比仅if语句要复杂得多。那就是你变得更加懒惰的原因:)
另一件事,您的
if x or y or z == 0:
会编译,但不会以您希望的方式编译。当您简单地将变量放在if语句中(示例)
if b
程序将检查变量是否不为null。编写上述声明的另一种方法(更有意义)是
if bool(b)
Bool是python中的一个内置函数,它基本上执行验证布尔语句的命令(如果您不知道这是什么,那就是您正在尝试在if语句中创建的内容:))
我发现的另一种懒惰方式是:
if any([x==0, y==0, z==0])
要检查一组变量中是否包含值,可以使用内置模块itertools
和operator
。
例如:
进口:
from itertools import repeat
from operator import contains
声明变量:
x = 0
y = 1
z = 3
创建值的映射(以您要检查的顺序):
check_values = (0, 1, 3)
使用itertools
允许重复变量:
check_vars = repeat((x, y, z))
最后,使用map
函数创建一个迭代器:
checker = map(contains, check_vars, check_values)
然后,在检查值(按原始顺序)时,使用next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
等...
这比lambdax:xin(变量)
有一个优势,因为operator
是一个内置模块,比使用lambda
,它必须创建一个自定义的就地功能。
另一个用于检查列表中是否存在非零(或False)值的选项:
not (x and y and z)
等效:
not all((x, y, z))
在这里设置是一种好方法,因为它对变量进行排序,这似乎是您的目标。不管参数的顺序如何,{z,y,x}
都是{0,1,3}
。
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
这样,整个解决方案就是O(n)。
此处提供的所有出色答案都集中于原始海报的特定要求,并集中于Martijn Pieters提出的{x,y,z} 中的if1.
他们忽略的是问题的更广泛含义:
如何针对多个值测试一个变量?
如果使用字符串,例如,提供的解决方案不适用于部分匹配:< br>测试字符串" Wild"是否有多个值
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
或
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
在这种情况下,最容易转换为字符串
>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>>
>>> if "Wild" in str([x, y, z]): print (True)
...
True
>>> if "Wild" in str({x, y, z}): print (True)
...
True
但是应注意,如@codeforester
所述,这种方法会丢失单词边界,例如:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
列表中的3个字母rot
确实存在,但不是单个单词。测试"腐烂"将失败,但是如果列表项之一"在地狱腐烂"也将失败。
结果是,如果使用此方法,请小心搜索条件,并注意这样做有这个限制。
我认为这样做会更好:
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
如果要使用if,则以下其他语句是另一个解决方案:
myList = []
aList = [0, 1, 3]
for l in aList:
if l==0: myList.append('c')
elif l==1: myList.append('d')
elif l==2: myList.append('e')
elif l==3: myList.append('f')
print(myList)
d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]
此代码可能会有所帮助
L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
List2.append(t[1])
break;
您可以尝试以下显示的方法。在这种方法中,您可以自由指定/输入要输入的变量数。
mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []
num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.
for i in range(num_var):
''' Enter 0 as first input, 1 as second input and 3 as third input.'''
globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
mylist += mydict[globals()['var'+str('i').zfill(3)]]
print mylist
>>> ['c', 'd', 'f']
单行解决方案:
mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]
或者:
mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
也许您需要直接的公式来设置输出位。
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':0xb100'f':0xb1000
isc(是'c')的关系:
if xyz=0 then isc=1 else isc=0
如果公式 https://youtu.be/KAdKCgBGKPhh<=HZ <3 < / a>
[c]:(xyz=0和isc=1)或(((xyz=0和isc=1)或(isc=0))和(isc=0))
< / p>
[d]:(((x-1)(y-1)(z-1)=0和isc=2)或((((xyz=0和isd=2)或(isc=0))和(isc = 0))
...
通过以下逻辑连接这些公式:
和
是方程的平方和or
是方程式的产物您将有一个表达和的总方程式,并且有总和的方程式
那么sum&1是c,sum&2是d,sum&4是e,sum&5是f
此后,您可以形成预定义的数组,其中字符串元素的索引将与就绪字符串相对应。
array[sum]
为您提供字符串。
可以很容易地完成
for value in [var1,var2,var3]:
li.append("targetValue")
用Python表示伪代码的最简便的方法是:
x = 0
y = 1
z = 3
mylist = []
if any(v == 0 for v in (x, y, z)):
mylist.append("c")
if any(v == 1 for v in (x, y, z)):
mylist.append("d")
if any(v == 2 for v in (x, y, z)):
mylist.append("e")
if any(v == 3 for v in (x, y, z)):
mylist.append("f")
要用一个值测试多个变量:如果{a,b,c}中为1:
要使用一个变量测试多个值:如果{1、2、3}中的a:
好像您正在构建某种凯撒密码。
更通用的方法是:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
输出
['c', 'd', 'f']
不确定这是否是代码的理想副作用,但输出的顺序将始终排序。
如果这是您想要的,可以将最后一行更改为:
sorted([chr(val + origo) for val in inputs])
您可以使用字典:
x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
list.append(dict[x])
else:
pass
if y in dict:
list.append(dict[y])
else:
pass
if z in dict:
list.append(dict[z])
else:
pass
print list
没有字典,请尝试以下解决方案:
x, y, z = 0, 1, 3
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]
并给出:
['c', 'd', 'f']
这将为您提供帮助。
def test_fun(val):
x = 0
y = 1
z = 2
myList = []
if val in (x, y, z) and val == 0:
myList.append("C")
if val in (x, y, z) and val == 1:
myList.append("D")
if val in (x, y, z) and val == 2:
myList.append("E")
test_fun(2);
您可以团结起来
x = 0
y = 1
z = 3
在一个变量中。
In [1]: xyz = (0,1,3,)
In [2]: mylist = []
将我们的条件更改为:
In [3]: if 0 in xyz:
...: mylist.append("c")
...: if 1 in xyz:
...: mylist.append("d")
...: if 2 in xyz:
...: mylist.append("e")
...: if 3 in xyz:
...: mylist.append("f")
输出:
In [21]: mylist
Out[21]: ['c', 'd', 'f']
用于测试多个值的模式
>>> 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
以前的表达式的一种概括是基于 ytpillai 的答案:
>>> any([0 is True, 0 is False])
False
可以写为
>>> any(0 is item for item in (True, False))
False
尽管此表达式返回正确的结果,但其可读性不如第一个表达式:-(