python - title用法 - plt.text用法




如何根据值测试多个变量? (10)

我试图做一个函数,将多个变量比较为一个整数,并输出一个由三个字母组成的字符串。 我想知道是否有办法将其转换为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"]

是这样的可能吗?


Set是这里的好方法,因为它定义了变量,这里似乎是你的目标。 无论参数的顺序如何{z,y,x}都是{0,1,3}

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

这样,整个解决方案是O(n)。


以前的解决方案:正如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])

不要太复杂,只要按照最简单的方式。

 x = 0
 y = 1
 z = 3

 Mylist = []

 if x == 0 or y==0 or z==0:
     Mylist.append('c')
 elif x == 1 or y == 1 or z==1:
     Mylist.append('d')
 elif x==2 or y==2 or z==2:
     Mylist.append('e')
 elif x==3 or y==3 or z==3:
     Mylist.append('f')

干杯!


你误解布尔表达式是如何工作的; 他们不会像英文句子那样工作,并猜测你在这里讨论的是所有姓名的相同比较。 您正在寻找:

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

否则xy会自行评估(如果为0 ,则为False ,否则为True )。

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

if 1 in (x, y, z):

或更好:

if 1 in {x, y, z}:

使用set来利用恒定成本的成员资格测试(无论左手操作数是多少都需要一定的时间)。

当你使用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 ,数字0或空值(有关Python在布尔上下文中认为错误的详细信息,请参阅布尔表达式 )。

所以对于值x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0x or y or z会解析为2 ,因为这是参数中第一个类似真实的值。 然后2 == 1将是False ,即使y == 1将是True

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


x or y or z == 0的直接方式是

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

但我不认为,你喜欢它。 :)这种方式很难看。

另一种方式(更好)是:

0 in (x, y, z)

顺便说一句, 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

如果你想使用if,else语句是另一种解决方案:

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)

我认为这会更好地处理它:

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

此代码可能会有所帮助

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;

这里提供的所有优秀答案都集中在原始海报的具体要求上,并专注于Martijn Pieters提出的if 1 in {x,y,z}解决方案中的if 1 in {x,y,z}
他们忽视的是这个问题的更广泛的含义:
如何针对多个值测试一个变量?
如果使用字符串,提供的解决方案不适用于部分匹配:
测试字符串“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

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]




boolean-logic