如何测试多个变量以相对于单个值的平等?
我正在尝试制作一个可以将多个变量与整数进行比较并输出三个字母的函数。我想知道是否有一种将其转化为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"]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
在Python中代表您的伪代码的最PYTHONIC方式是:
The most pythonic way of representing your pseudo-code in Python would be:
可以轻松完成
It can be done easily as
要测试具有一个单个值的多个变量:
如果1 in {a,b,c}:
以一个变量测试多个值:
如果a in {1,2,3}:< /代码>
To test multiple variables with one single value:
if 1 in {a,b,c}:
To test multiple values with one variable:
if a in {1, 2, 3}:
看起来您正在构建某种凯撒密码。
一个更具概括的方法是:
输出
不确定它是否是代码的所需副作用,但是输出顺序将始终进行分类。
如果这是您想要的,则可以将最后一行更改为:
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
outputs
Not sure if it's a desired side effect of your code, but the order of your output will always be sorted.
If this is what you want, the final line can be changed to:
您可以使用字典:
You can use dictionary :
没有dict,请尝试此解决方案:
并给出:
Without dict, try this solution:
and gives:
这将帮助您。
This will help you.
您可以将其团结
在一个变量中。
将我们的条件更改为:
输出:
You can unite this
in one variable.
Change our conditions as:
Output:
您可以通过两种方式开发它
或
you can develop it through two ways
Or
或
无法正常工作,如通过此答案解释。虽然通用答案是使用,
但这并不是特定问题的最佳答案。在您的情况下,您正在进行重复测试,因此值得撰写这些变量的 set :
我们可以使用词典来简化这一点 - 这将导致相同值:
或者,如果
myList
的订购是任意的,则可以循环循环 values 并将它们匹配到映射:The
or
does not work like that, as explained by this answer.While the generic answer would be use
this is not the best one for the specific problem. In your case you're doing repeated tests, therefore it is worthwhile to compose a set of these variables:
We can simplify this using a dictionary - this will result in the same values:
Or if the ordering of the
mylist
is arbitrary, you can loop over the values instead and match them to the mappings:问题
虽然测试多个值的模式
非常可读性,并且在许多情况下都可以正常工作,但有一个陷阱:
但是我们希望解决
一个
以前的表达式的概括基于 ytpillai :
可以写成
时,当此表达式返回正确的结果时,它不如第一个表达式读取结果:-(
Problem
While the pattern for testing multiple values
is very readable and is working in many situation, there is one pitfall:
But we want to have
Solution
One generalization of the previous expression is based on the answer from ytpillai:
which can be written as
While this expression returns the right result it is not as readable as the first expression :-(
要针对单个值测试多个变量:
将变量包装在设定对象中,例如{a,b,c}。
使用在运算符测试该值是否存储在任何变量中。
如果将值存储在至少一个变量中,则运算符将返回true。
To test multiple variables against a single value:
Wrap the variables in a set object, e.g. {a, b, c}.
Use the in operator to test if the value is stored in any of the variables.
The in operator will return True if the value is stored in at least one of the variables.
这是另一种方法:
它是列表理解和 关键字的混合。
Here is one more way to do it:
It is a mix of list comprehension and any keyword.
使用没有示例的使用:
usage without if example:
首先,对
或
有条件的校正:您需要说:
原因是“或”将条件分为单独的逻辑部分。您的原始语句的写作方式,这些部分是:
最后一部分很好---检查是否z == 0,例如---但前两个部分基本上说
如果x
和如果y
。由于整数始终对true
进行评估,除非它们为0,否则这意味着您条件的第一部分始终是true
当x
或时y
不等于0(在y的情况下,由于您有y = 1
,因此导致了整个条件(因为>>>>>>>
始终为。为了避免 通过假装不存在
或
语句的另一面,这是您可以确认您的或
条件是否正确定义的方式。您会单独编写陈述:
这意味着使用
或
关键字的正确MERGIN是:第二,如何解决问题:
您基本上想检查以查看是否有任何变量匹配给定的整数,如果是的话,请分配一个字母,以一对一的映射匹配它。您想为某些整数列表做到这一点,以便输出是字母列表。您会这样做:
同样,您可以使用列表理解来更快地达到相同的结果:
FIRST, A CORRECTION TO THE
OR
CONDITIONAL:You need to say:
The reason is that "or" splits up the condition into separate logical parts. The way your original statement was written, those parts were:
The last part was fine --- checking to see if z == 0, for instance --- but the first two parts just said essentially
if x
andif y
. Since integers always evaluate toTrue
unless they're 0, that means the first part of your condition was alwaysTrue
whenx
ory
didn't equal 0 (which in the case of y was always, since you hady = 1
, causing your whole condition (because of howOR
works) to always beTrue
.To avoid that, you need to make sure all parts of your condition (each side of the
OR
) make sense on their own (you can do that by pretending that the other side(s) of theOR
statement doesn't exist). That's how you can confirm whether or not yourOR
condition is correctly defined.You would write the statements individually like so:
which means the correct mergin with the
OR
keyword would be:SECOND, HOW TO SOLVE THE PROBLEM:
You're basically wanting to check to see if any of the variables match a given integer and if so, assign it a letter that matches it in a one-to-one mapping. You want to do that for a certain list of integers so that the output is a list of letters. You'd do that like this:
Similarly, you could use LIST COMPREHENSION to achieve the same result faster:
您误解了布尔表达方式;他们不像英语句子那样工作,猜猜您在这里谈论的所有名称都相同的比较。您正在寻找:
x
和y
另有自己评估(false
,如果0
,,> true
否则)。您可以使用针对
或者仍然更好:
使用要利用恒定成本的会员测试(中的
,无论左手操作数是什么时间)。
说明
当您使用
或
时,Python将操作员的每一侧视为 extair 表达式。表达式x或y == 1
首先将其视为x
的布尔测试,然后如果是false,则表达式y == 1
已测试。这是由于操作员优先。
或
操作员的优先级低于==
测试,因此对后者进行了评估 first 。但是,即使不是不是 ,并且表达式
x或y或z == 1
实际上也被解释为(x或y或z)= = 1
而是,这仍然不会做您期望的事情。X或Y或Z
将评估第一个参数,例如“真实”,例如false
,数字0或空(见 boolean Expressions 有关python在布尔语境中认为false的详细信息)。因此,对于值
x = 2; y = 1; z = 0
,x或y或z
将解析为2
,因为这是参数中的第一个真实值。然后2 == 1
将是false
,即使y == 1
将是true
。相反的情况也适用;针对单个变量测试多个值;
x == 1或2或3
由于相同的原因而失败。使用x == 1或x == 2或x == 3
或x in {1,2,3}
。You misunderstand how boolean expressions work; they don't work like an English sentence and guess that you are talking about the same comparison for all names here. You are looking for:
x
andy
are otherwise evaluated on their own (False
if0
,True
otherwise).You can shorten that using a containment test against a tuple:
or better still:
using a
set
to take advantage of the constant-cost membership test (i.e.in
takes a fixed amount of time whatever the left-hand operand is).Explanation
When you use
or
, python sees each side of the operator as separate expressions. The expressionx or y == 1
is treated as first a boolean test forx
, then if that is False, the expressiony == 1
is tested.This is due to operator precedence. The
or
operator has a lower precedence than the==
test, so the latter is evaluated first.However, even if this were not the case, and the expression
x or y or z == 1
was actually interpreted as(x or y or z) == 1
instead, this would still not do what you expect it to do.x or y or z
would evaluate to the first argument that is 'truthy', e.g. notFalse
, numeric 0 or empty (see boolean expressions for details on what Python considers false in a boolean context).So for the values
x = 2; y = 1; z = 0
,x or y or z
would resolve to2
, because that is the first true-like value in the arguments. Then2 == 1
would beFalse
, even thoughy == 1
would beTrue
.The same would apply to the inverse; testing multiple values against a single variable;
x == 1 or 2 or 3
would fail for the same reasons. Usex == 1 or x == 2 or x == 3
orx in {1, 2, 3}
.使用类似的字典结构更容易解决您的问题:
Your problem is more easily addressed with a dictionary structure like:
正如Martijn Pieters所说的,正确,最快的格式是:
使用他的建议,您现在将拥有单独的IF statement 。例如:
这将起作用,但是如果您很舒服使用词典(请参阅我在那里所做的),您可以通过制作初始字典将数字映射到您想要的字母中来清理此操作,然后使用循环:
As stated by Martijn Pieters, the correct, and fastest, format is:
Using his advice you would now have separate if-statements so that Python will read each statement whether the former were
True
orFalse
. Such as:This will work, but if you are comfortable using dictionaries (see what I did there), you can clean this up by making an initial dictionary mapping the numbers to the letters you want, then just using a for-loop:
编写
X或Y或Z == 0
的直接方法是,但我不认为,您喜欢它。 :)
这种方式很丑陋。
另一种方式(更好)是:
btw很多如果可以写成这样的东西
The direct way to write
x or y or z == 0
isBut I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
BTW lots of
if
s could be written as something like this要检查一个值是否包含在一组变量中,您可以使用内置模块
itertools
operator 。例如:
导入:
声明变量:
创建值的映射(按照要检查的顺序):
使用
itertools
允许重复变量:最后,使用
map
创建迭代器的函数:然后,在检查值(按原始顺序)检查时,请使用
next()
:etc ...
这比
lambda x:x in (变量)
因为操作员
是一个内置的模块,比使用lambda
必须更快,更有效,该模块必须创建一个自定义的原位功能。检查列表中是否有非零(或false)值的另一个选项:
等效:
To check if a value is contained within a set of variables you can use the inbuilt modules
itertools
andoperator
.For example:
Imports:
Declare variables:
Create mapping of values (in the order you want to check):
Use
itertools
to allow repetition of the variables:Finally, use the
map
function to create an iterator:Then, when checking for the values (in the original order), use
next()
:etc...
This has an advantage over the
lambda x: x in (variables)
becauseoperator
is an inbuilt module and is faster and more efficient than usinglambda
which has to create a custom in-place function.Another option for checking if there is a non-zero (or False) value in a list:
Equivalent:
如果您非常懒惰,则可以将这些值放入数组中。例如,
您也可以将数字和字母放在字典中并做到这一点,但这可能比简单地说陈述要复杂得多。这就是您尝试变得更加懒惰的方法:)
还有一件事,您的
遗嘱会汇编,但不是您想要的。当您简单地将变量放在if语句(示例)中时,
程序将检查该变量是否不是null。编写上述语句(更有意义)的另一种方法是
Bool是Python中的内置函数,它基本上可以验证Boolean语句(如果您不知道那是什么,那就是您要制作的内容在您现在的IF语句中:))
我发现的另一种懒惰方式是:
If you ARE very very lazy, you can put the values inside an array. Such as
You can also put the numbers and letters in a dictionary and do it, but this is probably a LOT more complicated than simply if statements. That's what you get for trying to be extra lazy :)
One more thing, your
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
Bool is an inbuilt function in python which basically does the command of verifying a boolean statement (If you don't know what that is, it is what you are trying to make in your if statement right now :))
Another lazy way I found is :
设置是这里的好方法,因为它订购了变量,在这里似乎是您的目标。
{z,y,x}
是{0,1,3}
无论参数的顺序如何。这样,整个解决方案是o(n)。
Set is the good approach here, because it orders the variables, what seems to be your goal here.
{z,y,x}
is{0,1,3}
whatever the order of the parameters.This way, the whole solution is O(n).
我认为这将更好地处理:
输出:
I think this will handle it better:
Output:
如果您想使用,则以下是另一种解决方案:
If you want to use if, else statements following is another solution:
此处提供的所有出色答案都集中在原始海报的具体要求上,并集中于
{x,y,z} in {x,y,z} 的解决方案。
他们忽略的是这个问题的更广泛含义:
如何针对多个值测试一个变量?
如果使用字符串,则提供的解决方案对部分命中无效:
测试字符串“野生”是否在多个值中
,或者
在这种情况下,最容易转换为字符串,
则应注意,如
@codeforester
所述,该方法范围丢失了此方法,如:3个字母
rot
确实存在于列表中,但不是单个单词。对“腐烂”的测试将失败,但是如果列表项目之一是“地狱中的腐烂”,那也将失败。结果是,如果使用此方法,请注意您的搜索标准,并注意它确实有此限制。
All of the excellent answers provided here concentrate on the specific requirement of the original poster and concentrate on the
if 1 in {x,y,z}
solution put forward by Martijn Pieters.What they ignore is the broader implication of the question:
How do I test one variable against multiple values?
The solution provided will not work for partial hits if using strings for example:
Test if the string "Wild" is in multiple values
or
for this scenario it's easiest to convert to a string
It should be noted however, as mentioned by
@codeforester
, that word boundries are lost with this method, as in:the 3 letters
rot
do exist in combination in the list but not as an individual word. Testing for " rot " would fail but if one of the list items were "rot in hell", that would fail as well.The upshot being, be careful with your search criteria if using this method and be aware that it does have this limitation.
此代码可能会有所帮助
This code may be helpful
您可以尝试下面显示的方法。在此方法中,您将可以自由地指定/输入要输入的变量数量。
You can try the method shown below. In this method, you will have the freedom to specify/input the number of variables that you wish to enter.
一条解决方案:
或:
One line solution:
Or:
也许您需要直接公式来设置输出位。
让我们映射到位:
'c':1'D':0xB10'e':0xB100'f':0xb1000
isc的关系(is'c'):
如果公式
[c]:
(xyz = 0和isc = 1)或(((((xyz = 0 andc = 1))或(isc = 0))和(isc = 0))
[d]:
( (x-1)(y-1)(z-1)= 0和isc = 2)或((((xyz = 0 and isd = 2))或(isc = 0))和(isc = 0))
...
通过以下逻辑来连接这些公式:
和
是方程式或
是方程的产物,您将拥有一个总方程式
express sum,您拥有总和的总公式
,然后总和1是c,sum&amp; 2 is d,sum&amp; 4 is e,sum&amp; 5 is f eft eft
efter the之后,您可以形成预定义的数组。
array [sum]
为您提供字符串。Maybe you need direct formula for output bits set.
Let's map to bits:
'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
Relation of isc (is 'c'):
Use math if formula https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315
[c]:
(xyz=0 and isc=1) or (((xyz=0 and isc=1) or (isc=0)) and (isc=0))
[d]:
((x-1)(y-1)(z-1)=0 and isc=2) or (((xyz=0 and isd=2) or (isc=0)) and (isc=0))
...
Connect these formulas by following logic:
and
is the sum of squares of equationsor
is the product of equationsand you'll have a total equation
express sum and you have total formula of sum
then sum&1 is c, sum&2 is d, sum&4 is e, sum&5 is f
After this you may form predefined array where index of string elements would correspond to ready string.
array[sum]
gives you the string.