我试图制作一个函数,将多个变量与一个整数进行比较,并输出一个三个字母的字符串。我想知道是否有办法将其翻译成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"]
正如这个答案所解释的那样,or并不是那样工作的。
而通用答案将被使用
if 0 in (x, y, z):
...
这不是解决具体问题的最佳方法。在您的案例中,您正在进行重复测试,因此值得编写一组变量:
values = {x, y, z}
if 0 in values:
mylist.append("c")
if 1 in values:
mylist.append("d")
我们可以使用字典来简化这一点-这将产生相同的值:
mappings = {0: "c", 1: "d", ...}
for k in mappings:
if k in values:
mylist.append(mappings[k])
或者,如果mylist的顺序是任意的,则可以循环这些值,并将它们与映射匹配:
mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
if v in mappings:
mylist.append(mappings[v])
您可以尝试下面显示的方法。在该方法中,您可以自由指定/输入要输入的变量数量。
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']
还有一种方法:
x = 0
y = 1
z = 3
mylist = []
if any(i in [0] for i in[x,y,z]):
mylist.append("c")
if any(i in [1] for i in[x,y,z]):
mylist.append("d")
if any(i in [2] for i in[x,y,z]):
mylist.append("e")
if any(i in [3] for i in[x,y,z]):
mylist.append("f")
它是列表理解和任何关键字的混合。
单线解决方案:
mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]
Or:
mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
要检查值是否包含在一组变量中,可以使用内置模块itertools和运算符。
例如:
进口:
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
等
这比lambda x:x in(变量)有优势,因为运算符是一个内置模块,比使用lambda(必须创建自定义就地函数)更快、更高效。
检查列表中是否存在非零(或False)值的另一个选项:
not (x and y and z)
等效值:
not all((x, y, z))
正如这个答案所解释的那样,or并不是那样工作的。
而通用答案将被使用
if 0 in (x, y, z):
...
这不是解决具体问题的最佳方法。在您的案例中,您正在进行重复测试,因此值得编写一组变量:
values = {x, y, z}
if 0 in values:
mylist.append("c")
if 1 in values:
mylist.append("d")
我们可以使用字典来简化这一点-这将产生相同的值:
mappings = {0: "c", 1: "d", ...}
for k in mappings:
if k in values:
mylist.append(mappings[k])
或者,如果mylist的顺序是任意的,则可以循环这些值,并将它们与映射匹配:
mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
if v in mappings:
mylist.append(mappings[v])