How to test multiple variables against a value?
I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:
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")
which would return a list of
["c", "d", "f"]
Is something like this possible?
python if-statement comparison match boolean-logic
add a comment |
I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:
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")
which would return a list of
["c", "d", "f"]
Is something like this possible?
python if-statement comparison match boolean-logic
3
use1
in (tuple)
– Dante
Dec 5 '17 at 21:49
When you want to evaluate a list of statements in a any/all manner you can useany
/all
functions. For example:all([1, 2, 3, 4, False])
will return Falseall([True, 1, 2, 3])
will return Trueany([False, 0, 0, False])
will return Falseany([False, 0, True, False])
will return True
– eddd
Jun 4 '18 at 16:17
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30
add a comment |
I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:
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")
which would return a list of
["c", "d", "f"]
Is something like this possible?
python if-statement comparison match boolean-logic
I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:
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")
which would return a list of
["c", "d", "f"]
Is something like this possible?
python if-statement comparison match boolean-logic
python if-statement comparison match boolean-logic
edited Feb 4 at 8:55
Georgy
2,14741528
2,14741528
asked Feb 27 '13 at 12:26
user1877442user1877442
2,666295
2,666295
3
use1
in (tuple)
– Dante
Dec 5 '17 at 21:49
When you want to evaluate a list of statements in a any/all manner you can useany
/all
functions. For example:all([1, 2, 3, 4, False])
will return Falseall([True, 1, 2, 3])
will return Trueany([False, 0, 0, False])
will return Falseany([False, 0, True, False])
will return True
– eddd
Jun 4 '18 at 16:17
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30
add a comment |
3
use1
in (tuple)
– Dante
Dec 5 '17 at 21:49
When you want to evaluate a list of statements in a any/all manner you can useany
/all
functions. For example:all([1, 2, 3, 4, False])
will return Falseall([True, 1, 2, 3])
will return Trueany([False, 0, 0, False])
will return Falseany([False, 0, True, False])
will return True
– eddd
Jun 4 '18 at 16:17
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30
3
3
use
1
in (tuple)– Dante
Dec 5 '17 at 21:49
use
1
in (tuple)– Dante
Dec 5 '17 at 21:49
When you want to evaluate a list of statements in a any/all manner you can use
any
/all
functions. For example: all([1, 2, 3, 4, False])
will return False all([True, 1, 2, 3])
will return True any([False, 0, 0, False])
will return False any([False, 0, True, False])
will return True– eddd
Jun 4 '18 at 16:17
When you want to evaluate a list of statements in a any/all manner you can use
any
/all
functions. For example: all([1, 2, 3, 4, False])
will return False all([True, 1, 2, 3])
will return True any([False, 0, 0, False])
will return False any([False, 0, True, False])
will return True– eddd
Jun 4 '18 at 16:17
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30
add a comment |
20 Answers
20
active
oldest
votes
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:
if x == 1 or y == 1 or z == 1:
x
and y
are otherwise evaluated on their own (False
if 0
, True
otherwise).
You can shorten that using a containment test against a tuple:
if 1 in (x, y, z):
or better still:
if 1 in {x, y, z}:
using a set
to take advantage of the constant-cost membership test (in
takes a fixed amount of time whatever the left-hand operand is).
When you use or
, python sees each side of the operator as separate expressions. The expression x or y == 1
is treated as first a boolean test for x
, then if that is False, the expression y == 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. not False
, 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 to 2
, because that is the first true-like value in the arguments. Then 2 == 1
would be False
, even though y == 1
would be True
.
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. Use x == 1 or x == 2 or x == 3
or x in {1, 2, 3}
.
89
I wouldn't be so quick to go for theset
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)
– SingleNegationElimination
Oct 24 '13 at 15:27
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
@MartijnPieters: Using theset
literal notation for this test isn't a savings unless the contents of theset
literal are also literals, right?if 1 in {x, y, z}:
can't cache theset
, becausex
,y
andz
could change, so either solution needs to build atuple
orset
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greaterset
creation time.
– ShadowRanger
Sep 4 '16 at 0:37
4
@ShadowRanger: yes, peephole optimisation (be it forin [...]
orin {...}
) only works if the contents of the list or set are immutable literals too.
– Martijn Pieters♦
Sep 4 '16 at 7:58
|
show 12 more comments
Your problem is more easily addressed with a dictionary structure like:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
17
Or evend = "cdef"
which leads toMyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
ormap(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
@MJM the output order is not determined by the dict, it is determined by the order of the list[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
add a comment |
Previous Solution: As stated by Martijn Pieters, the correct, and fastest, format is:
if 1 in {x, y, z}:
The one major issue that does not seem to be addressed is that you want your output list to include each letter after a true if statement.
Using only Martijn Pieters' advice you would now have:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Problem: The first if statement would return true, and you would never get to the following elif statement. So your list would simply return:
["c"]
What you want is to have separate if statements so that python will read each statement whether the former were true or false. Such as:
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")
...
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:
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
add a comment |
The direct way to write x or y or z == 0
is
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
But I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
0 in (x, y, z)
BTW lots of if
s could be written as something like this
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
6
In your example of thedict
instead of a key, you will get errors because the return value of.append
isNone
, and callingNone
gives anAttributeError
. In general I agree with this method, though.
– SethMMorton
Feb 8 '14 at 20:57
add a comment |
If you ARE very very lazy, you can put the values inside an array. Such as
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
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
if x or y or z == 0:
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
if b
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
if bool(b)
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 :
if any([x==0, y==0, z==0])
add a comment |
To check if a value is contained within a set of variables you can use the inbuilt modules itertools
and operator
.
For example:
Imports:
from itertools import repeat
from operator import contains
Declare variables:
x = 0
y = 1
z = 3
Create mapping of values (in the order you want to check):
check_values = (0, 1, 3)
Use itertools
to allow repetition of the variables:
check_vars = repeat((x, y, z))
Finally, use the map
function to create an iterator:
checker = map(contains, check_vars, check_values)
Then, when checking for the values (in the original order), use next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
etc...
This has an advantage over the lambda x: x in (variables)
because operator
is an inbuilt module and is faster and more efficient than using lambda
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:
not (x and y and z)
Equivalent:
not all((x, y, z))
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
add a comment |
I think this will handle it better:
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]
Output:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
add a comment |
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.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
This way, the whole solution is O(n).
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
add a comment |
If you want to use if, else statements following is another solution:
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)
add a comment |
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
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
or
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
for this scenario it's easiest to convert to a string
>>> [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
It should be noted however, as mentioned by @codeforester
, that word boundries are lost with this method, as in:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
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.
3
With the "convert to a string" approach, we lose the word boundaries and thein
check may not do the right thing.
– codeforester
Jun 21 '18 at 21:08
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
add a comment |
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]
add a comment |
This code may be helpful
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;
add a comment |
One line solution:
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)]
add a comment |
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.
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']
add a comment |
It can be done easily as
for value in [var1,var2,var3]:
li.append("targetValue")
add a comment |
The most mnemonic way of representing your pseudo-code in Python would be:
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")
add a comment |
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
outputs
['c', 'd', 'f']
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:
sorted([chr(val + origo) for val in inputs])
add a comment |
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}:
add a comment |
You can use dictionary :
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
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
add a comment |
Maybe you need direct formula for output bits set.
x=0 or y=0 or z=0 is equivalent to xyz = 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
lets map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
relation of isc:
if xyz=0 then isc=1 else isc=0
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:
logic and is sum of squares of equations
logic or is product of equations
and you'll have 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 element would correspond to ready string.
array[sum] gives you the string.
add a comment |
protected by Martijn Pieters♦ Mar 8 '15 at 1:18
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
20 Answers
20
active
oldest
votes
20 Answers
20
active
oldest
votes
active
oldest
votes
active
oldest
votes
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:
if x == 1 or y == 1 or z == 1:
x
and y
are otherwise evaluated on their own (False
if 0
, True
otherwise).
You can shorten that using a containment test against a tuple:
if 1 in (x, y, z):
or better still:
if 1 in {x, y, z}:
using a set
to take advantage of the constant-cost membership test (in
takes a fixed amount of time whatever the left-hand operand is).
When you use or
, python sees each side of the operator as separate expressions. The expression x or y == 1
is treated as first a boolean test for x
, then if that is False, the expression y == 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. not False
, 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 to 2
, because that is the first true-like value in the arguments. Then 2 == 1
would be False
, even though y == 1
would be True
.
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. Use x == 1 or x == 2 or x == 3
or x in {1, 2, 3}
.
89
I wouldn't be so quick to go for theset
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)
– SingleNegationElimination
Oct 24 '13 at 15:27
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
@MartijnPieters: Using theset
literal notation for this test isn't a savings unless the contents of theset
literal are also literals, right?if 1 in {x, y, z}:
can't cache theset
, becausex
,y
andz
could change, so either solution needs to build atuple
orset
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greaterset
creation time.
– ShadowRanger
Sep 4 '16 at 0:37
4
@ShadowRanger: yes, peephole optimisation (be it forin [...]
orin {...}
) only works if the contents of the list or set are immutable literals too.
– Martijn Pieters♦
Sep 4 '16 at 7:58
|
show 12 more comments
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:
if x == 1 or y == 1 or z == 1:
x
and y
are otherwise evaluated on their own (False
if 0
, True
otherwise).
You can shorten that using a containment test against a tuple:
if 1 in (x, y, z):
or better still:
if 1 in {x, y, z}:
using a set
to take advantage of the constant-cost membership test (in
takes a fixed amount of time whatever the left-hand operand is).
When you use or
, python sees each side of the operator as separate expressions. The expression x or y == 1
is treated as first a boolean test for x
, then if that is False, the expression y == 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. not False
, 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 to 2
, because that is the first true-like value in the arguments. Then 2 == 1
would be False
, even though y == 1
would be True
.
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. Use x == 1 or x == 2 or x == 3
or x in {1, 2, 3}
.
89
I wouldn't be so quick to go for theset
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)
– SingleNegationElimination
Oct 24 '13 at 15:27
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
@MartijnPieters: Using theset
literal notation for this test isn't a savings unless the contents of theset
literal are also literals, right?if 1 in {x, y, z}:
can't cache theset
, becausex
,y
andz
could change, so either solution needs to build atuple
orset
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greaterset
creation time.
– ShadowRanger
Sep 4 '16 at 0:37
4
@ShadowRanger: yes, peephole optimisation (be it forin [...]
orin {...}
) only works if the contents of the list or set are immutable literals too.
– Martijn Pieters♦
Sep 4 '16 at 7:58
|
show 12 more comments
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:
if x == 1 or y == 1 or z == 1:
x
and y
are otherwise evaluated on their own (False
if 0
, True
otherwise).
You can shorten that using a containment test against a tuple:
if 1 in (x, y, z):
or better still:
if 1 in {x, y, z}:
using a set
to take advantage of the constant-cost membership test (in
takes a fixed amount of time whatever the left-hand operand is).
When you use or
, python sees each side of the operator as separate expressions. The expression x or y == 1
is treated as first a boolean test for x
, then if that is False, the expression y == 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. not False
, 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 to 2
, because that is the first true-like value in the arguments. Then 2 == 1
would be False
, even though y == 1
would be True
.
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. Use x == 1 or x == 2 or x == 3
or 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:
if x == 1 or y == 1 or z == 1:
x
and y
are otherwise evaluated on their own (False
if 0
, True
otherwise).
You can shorten that using a containment test against a tuple:
if 1 in (x, y, z):
or better still:
if 1 in {x, y, z}:
using a set
to take advantage of the constant-cost membership test (in
takes a fixed amount of time whatever the left-hand operand is).
When you use or
, python sees each side of the operator as separate expressions. The expression x or y == 1
is treated as first a boolean test for x
, then if that is False, the expression y == 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. not False
, 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 to 2
, because that is the first true-like value in the arguments. Then 2 == 1
would be False
, even though y == 1
would be True
.
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. Use x == 1 or x == 2 or x == 3
or x in {1, 2, 3}
.
edited Mar 12 '18 at 19:56
answered Feb 27 '13 at 12:27
Martijn Pieters♦Martijn Pieters
719k14025112320
719k14025112320
89
I wouldn't be so quick to go for theset
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)
– SingleNegationElimination
Oct 24 '13 at 15:27
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
@MartijnPieters: Using theset
literal notation for this test isn't a savings unless the contents of theset
literal are also literals, right?if 1 in {x, y, z}:
can't cache theset
, becausex
,y
andz
could change, so either solution needs to build atuple
orset
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greaterset
creation time.
– ShadowRanger
Sep 4 '16 at 0:37
4
@ShadowRanger: yes, peephole optimisation (be it forin [...]
orin {...}
) only works if the contents of the list or set are immutable literals too.
– Martijn Pieters♦
Sep 4 '16 at 7:58
|
show 12 more comments
89
I wouldn't be so quick to go for theset
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)
– SingleNegationElimination
Oct 24 '13 at 15:27
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
@MartijnPieters: Using theset
literal notation for this test isn't a savings unless the contents of theset
literal are also literals, right?if 1 in {x, y, z}:
can't cache theset
, becausex
,y
andz
could change, so either solution needs to build atuple
orset
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greaterset
creation time.
– ShadowRanger
Sep 4 '16 at 0:37
4
@ShadowRanger: yes, peephole optimisation (be it forin [...]
orin {...}
) only works if the contents of the list or set are immutable literals too.
– Martijn Pieters♦
Sep 4 '16 at 7:58
89
89
I wouldn't be so quick to go for the
set
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test: timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)– SingleNegationElimination
Oct 24 '13 at 15:27
I wouldn't be so quick to go for the
set
version. Tuple's are very cheap to create and iterate over. On my machine at least, tuples are faster than sets so long as the size of the tuple is around 4-8 elements. If you have to scan more than that, use a set, but if you are looking for an item out of 2-4 possibilities, a tuple is still faster! If you can arrange for the most likely case to be first in the tuple, the win is even bigger: (my test: timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)– SingleNegationElimination
Oct 24 '13 at 15:27
42
42
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
@dequestarmappartialsetattr: In Python 3.3 and up, the set is stored as a constant, bypassing the creation time altogether, eliminating the creation time. Tuples can be cheap to create as Python caches a bundle of them to avoid memory churn, making that the biggest difference with sets here.
– Martijn Pieters♦
Oct 24 '13 at 15:29
9
9
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
@dequestarmappartialsetattr: If you time just the membership test, for integers sets and tuples are equally fast for the ideal scenario; matching the first element. After that tuples lose out to sets.
– Martijn Pieters♦
Oct 24 '13 at 15:37
12
12
@MartijnPieters: Using the
set
literal notation for this test isn't a savings unless the contents of the set
literal are also literals, right? if 1 in {x, y, z}:
can't cache the set
, because x
, y
and z
could change, so either solution needs to build a tuple
or set
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greater set
creation time.– ShadowRanger
Sep 4 '16 at 0:37
@MartijnPieters: Using the
set
literal notation for this test isn't a savings unless the contents of the set
literal are also literals, right? if 1 in {x, y, z}:
can't cache the set
, because x
, y
and z
could change, so either solution needs to build a tuple
or set
from scratch, and I suspect whatever lookup savings you might get when checking for membership would be swamped by greater set
creation time.– ShadowRanger
Sep 4 '16 at 0:37
4
4
@ShadowRanger: yes, peephole optimisation (be it for
in [...]
or in {...}
) only works if the contents of the list or set are immutable literals too.– Martijn Pieters♦
Sep 4 '16 at 7:58
@ShadowRanger: yes, peephole optimisation (be it for
in [...]
or in {...}
) only works if the contents of the list or set are immutable literals too.– Martijn Pieters♦
Sep 4 '16 at 7:58
|
show 12 more comments
Your problem is more easily addressed with a dictionary structure like:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
17
Or evend = "cdef"
which leads toMyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
ormap(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
@MJM the output order is not determined by the dict, it is determined by the order of the list[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
add a comment |
Your problem is more easily addressed with a dictionary structure like:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
17
Or evend = "cdef"
which leads toMyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
ormap(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
@MJM the output order is not determined by the dict, it is determined by the order of the list[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
add a comment |
Your problem is more easily addressed with a dictionary structure like:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
Your problem is more easily addressed with a dictionary structure like:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
edited Oct 25 '17 at 14:45
River
5,54483754
5,54483754
answered Jul 11 '13 at 21:56
dansalmodansalmo
8,37744046
8,37744046
17
Or evend = "cdef"
which leads toMyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
ormap(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
@MJM the output order is not determined by the dict, it is determined by the order of the list[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
add a comment |
17
Or evend = "cdef"
which leads toMyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
ormap(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
@MJM the output order is not determined by the dict, it is determined by the order of the list[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
17
17
Or even
d = "cdef"
which leads to MyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
Or even
d = "cdef"
which leads to MyList = ["cdef"[k] for k in [x, y, z]]
– aragaer
Oct 24 '13 at 15:39
9
9
or
map(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
or
map(lambda i: 'cdef'[i], [x, y, z])
– dansalmo
May 8 '14 at 14:36
3
3
@MJM the output order is not determined by the dict, it is determined by the order of the list
[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
@MJM the output order is not determined by the dict, it is determined by the order of the list
[x, y, z]
– dansalmo
Jul 24 '18 at 21:05
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
Aside from the list comprehension which I'm not yet fully accustomed to, most of us had the same reflex: build that dict !
– LoneWanderer
Mar 10 at 18:57
add a comment |
Previous Solution: As stated by Martijn Pieters, the correct, and fastest, format is:
if 1 in {x, y, z}:
The one major issue that does not seem to be addressed is that you want your output list to include each letter after a true if statement.
Using only Martijn Pieters' advice you would now have:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Problem: The first if statement would return true, and you would never get to the following elif statement. So your list would simply return:
["c"]
What you want is to have separate if statements so that python will read each statement whether the former were true or false. Such as:
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")
...
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:
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
add a comment |
Previous Solution: As stated by Martijn Pieters, the correct, and fastest, format is:
if 1 in {x, y, z}:
The one major issue that does not seem to be addressed is that you want your output list to include each letter after a true if statement.
Using only Martijn Pieters' advice you would now have:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Problem: The first if statement would return true, and you would never get to the following elif statement. So your list would simply return:
["c"]
What you want is to have separate if statements so that python will read each statement whether the former were true or false. Such as:
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")
...
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:
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
add a comment |
Previous Solution: As stated by Martijn Pieters, the correct, and fastest, format is:
if 1 in {x, y, z}:
The one major issue that does not seem to be addressed is that you want your output list to include each letter after a true if statement.
Using only Martijn Pieters' advice you would now have:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Problem: The first if statement would return true, and you would never get to the following elif statement. So your list would simply return:
["c"]
What you want is to have separate if statements so that python will read each statement whether the former were true or false. Such as:
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")
...
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:
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
Previous Solution: As stated by Martijn Pieters, the correct, and fastest, format is:
if 1 in {x, y, z}:
The one major issue that does not seem to be addressed is that you want your output list to include each letter after a true if statement.
Using only Martijn Pieters' advice you would now have:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Problem: The first if statement would return true, and you would never get to the following elif statement. So your list would simply return:
["c"]
What you want is to have separate if statements so that python will read each statement whether the former were true or false. Such as:
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")
...
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:
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
edited Aug 19 '15 at 15:18
answered Aug 19 '15 at 2:34
ThatGuyRussellThatGuyRussell
938617
938617
add a comment |
add a comment |
The direct way to write x or y or z == 0
is
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
But I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
0 in (x, y, z)
BTW lots of if
s could be written as something like this
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
6
In your example of thedict
instead of a key, you will get errors because the return value of.append
isNone
, and callingNone
gives anAttributeError
. In general I agree with this method, though.
– SethMMorton
Feb 8 '14 at 20:57
add a comment |
The direct way to write x or y or z == 0
is
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
But I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
0 in (x, y, z)
BTW lots of if
s could be written as something like this
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
6
In your example of thedict
instead of a key, you will get errors because the return value of.append
isNone
, and callingNone
gives anAttributeError
. In general I agree with this method, though.
– SethMMorton
Feb 8 '14 at 20:57
add a comment |
The direct way to write x or y or z == 0
is
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
But I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
0 in (x, y, z)
BTW lots of if
s could be written as something like this
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
The direct way to write x or y or z == 0
is
if any(map((lambda value: value == 0), (x,y,z))):
pass # write your logic.
But I dont think, you like it. :)
And this way is ugly.
The other way (a better) is:
0 in (x, y, z)
BTW lots of if
s could be written as something like this
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
edited Jul 11 '13 at 21:24
answered Jul 11 '13 at 21:16
akaRemakaRem
3,22732235
3,22732235
6
In your example of thedict
instead of a key, you will get errors because the return value of.append
isNone
, and callingNone
gives anAttributeError
. In general I agree with this method, though.
– SethMMorton
Feb 8 '14 at 20:57
add a comment |
6
In your example of thedict
instead of a key, you will get errors because the return value of.append
isNone
, and callingNone
gives anAttributeError
. In general I agree with this method, though.
– SethMMorton
Feb 8 '14 at 20:57
6
6
In your example of the
dict
instead of a key, you will get errors because the return value of .append
is None
, and calling None
gives an AttributeError
. In general I agree with this method, though.– SethMMorton
Feb 8 '14 at 20:57
In your example of the
dict
instead of a key, you will get errors because the return value of .append
is None
, and calling None
gives an AttributeError
. In general I agree with this method, though.– SethMMorton
Feb 8 '14 at 20:57
add a comment |
If you ARE very very lazy, you can put the values inside an array. Such as
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
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
if x or y or z == 0:
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
if b
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
if bool(b)
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 :
if any([x==0, y==0, z==0])
add a comment |
If you ARE very very lazy, you can put the values inside an array. Such as
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
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
if x or y or z == 0:
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
if b
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
if bool(b)
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 :
if any([x==0, y==0, z==0])
add a comment |
If you ARE very very lazy, you can put the values inside an array. Such as
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
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
if x or y or z == 0:
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
if b
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
if bool(b)
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 :
if any([x==0, y==0, z==0])
If you ARE very very lazy, you can put the values inside an array. Such as
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
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
if x or y or z == 0:
will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)
if b
the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is
if bool(b)
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 :
if any([x==0, y==0, z==0])
edited Aug 13 '15 at 18:06
answered May 25 '15 at 3:53
ytpillaiytpillai
2,2711834
2,2711834
add a comment |
add a comment |
To check if a value is contained within a set of variables you can use the inbuilt modules itertools
and operator
.
For example:
Imports:
from itertools import repeat
from operator import contains
Declare variables:
x = 0
y = 1
z = 3
Create mapping of values (in the order you want to check):
check_values = (0, 1, 3)
Use itertools
to allow repetition of the variables:
check_vars = repeat((x, y, z))
Finally, use the map
function to create an iterator:
checker = map(contains, check_vars, check_values)
Then, when checking for the values (in the original order), use next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
etc...
This has an advantage over the lambda x: x in (variables)
because operator
is an inbuilt module and is faster and more efficient than using lambda
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:
not (x and y and z)
Equivalent:
not all((x, y, z))
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
add a comment |
To check if a value is contained within a set of variables you can use the inbuilt modules itertools
and operator
.
For example:
Imports:
from itertools import repeat
from operator import contains
Declare variables:
x = 0
y = 1
z = 3
Create mapping of values (in the order you want to check):
check_values = (0, 1, 3)
Use itertools
to allow repetition of the variables:
check_vars = repeat((x, y, z))
Finally, use the map
function to create an iterator:
checker = map(contains, check_vars, check_values)
Then, when checking for the values (in the original order), use next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
etc...
This has an advantage over the lambda x: x in (variables)
because operator
is an inbuilt module and is faster and more efficient than using lambda
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:
not (x and y and z)
Equivalent:
not all((x, y, z))
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
add a comment |
To check if a value is contained within a set of variables you can use the inbuilt modules itertools
and operator
.
For example:
Imports:
from itertools import repeat
from operator import contains
Declare variables:
x = 0
y = 1
z = 3
Create mapping of values (in the order you want to check):
check_values = (0, 1, 3)
Use itertools
to allow repetition of the variables:
check_vars = repeat((x, y, z))
Finally, use the map
function to create an iterator:
checker = map(contains, check_vars, check_values)
Then, when checking for the values (in the original order), use next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
etc...
This has an advantage over the lambda x: x in (variables)
because operator
is an inbuilt module and is faster and more efficient than using lambda
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:
not (x and y and z)
Equivalent:
not all((x, y, z))
To check if a value is contained within a set of variables you can use the inbuilt modules itertools
and operator
.
For example:
Imports:
from itertools import repeat
from operator import contains
Declare variables:
x = 0
y = 1
z = 3
Create mapping of values (in the order you want to check):
check_values = (0, 1, 3)
Use itertools
to allow repetition of the variables:
check_vars = repeat((x, y, z))
Finally, use the map
function to create an iterator:
checker = map(contains, check_vars, check_values)
Then, when checking for the values (in the original order), use next()
:
if next(checker) # Checks for 0
# Do something
pass
elif next(checker) # Checks for 1
# Do something
pass
etc...
This has an advantage over the lambda x: x in (variables)
because operator
is an inbuilt module and is faster and more efficient than using lambda
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:
not (x and y and z)
Equivalent:
not all((x, y, z))
edited Jun 5 '14 at 11:31
answered Jun 4 '14 at 17:09
GuiltyDolphinGuiltyDolphin
6201610
6201610
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
add a comment |
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
This doesn't answer the OP's question. It only covers the first case in the provided example.
– wallacer
Jun 4 '14 at 17:39
add a comment |
I think this will handle it better:
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]
Output:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
add a comment |
I think this will handle it better:
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]
Output:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
add a comment |
I think this will handle it better:
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]
Output:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
I think this will handle it better:
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]
Output:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
edited Feb 10 '15 at 14:58
shuttle87
11.4k659100
11.4k659100
answered Jan 13 '15 at 12:10
Bhargav BodaBhargav Boda
23123
23123
add a comment |
add a comment |
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.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
This way, the whole solution is O(n).
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
add a comment |
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.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
This way, the whole solution is O(n).
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
add a comment |
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.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
This way, the whole solution is 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.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
This way, the whole solution is O(n).
edited Apr 1 '18 at 13:10
answered Jun 9 '15 at 20:46
B. M.B. M.
13.4k12037
13.4k12037
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
add a comment |
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
4
4
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
You should add a description of what your code accomplishes and how it does it. Short answers using only code is discouraged
– Raniz
Jun 10 '15 at 4:19
add a comment |
If you want to use if, else statements following is another solution:
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)
add a comment |
If you want to use if, else statements following is another solution:
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)
add a comment |
If you want to use if, else statements following is another solution:
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)
If you want to use if, else statements following is another solution:
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)
edited Sep 4 '18 at 3:53
Vishvajit Pathak
1,024913
1,024913
answered Apr 10 '15 at 3:29
paarsapaarsa
33125
33125
add a comment |
add a comment |
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
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
or
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
for this scenario it's easiest to convert to a string
>>> [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
It should be noted however, as mentioned by @codeforester
, that word boundries are lost with this method, as in:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
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.
3
With the "convert to a string" approach, we lose the word boundaries and thein
check may not do the right thing.
– codeforester
Jun 21 '18 at 21:08
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
add a comment |
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
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
or
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
for this scenario it's easiest to convert to a string
>>> [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
It should be noted however, as mentioned by @codeforester
, that word boundries are lost with this method, as in:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
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.
3
With the "convert to a string" approach, we lose the word boundaries and thein
check may not do the right thing.
– codeforester
Jun 21 '18 at 21:08
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
add a comment |
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
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
or
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
for this scenario it's easiest to convert to a string
>>> [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
It should be noted however, as mentioned by @codeforester
, that word boundries are lost with this method, as in:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
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.
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
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...
or
>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...
for this scenario it's easiest to convert to a string
>>> [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
It should be noted however, as mentioned by @codeforester
, that word boundries are lost with this method, as in:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
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.
edited Sep 4 '18 at 11:59
Vishvajit Pathak
1,024913
1,024913
answered Sep 10 '16 at 15:44
Rolf of SaxonyRolf of Saxony
9,25021738
9,25021738
3
With the "convert to a string" approach, we lose the word boundaries and thein
check may not do the right thing.
– codeforester
Jun 21 '18 at 21:08
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
add a comment |
3
With the "convert to a string" approach, we lose the word boundaries and thein
check may not do the right thing.
– codeforester
Jun 21 '18 at 21:08
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
3
3
With the "convert to a string" approach, we lose the word boundaries and the
in
check may not do the right thing.– codeforester
Jun 21 '18 at 21:08
With the "convert to a string" approach, we lose the word boundaries and the
in
check may not do the right thing.– codeforester
Jun 21 '18 at 21:08
2
2
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
@codeforester Your point is a fair one and I'll mention it in the answer.
– Rolf of Saxony
Jun 22 '18 at 7:41
add a comment |
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]
add a comment |
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]
add a comment |
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]
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]
edited Feb 27 '15 at 1:48
answered Feb 27 '15 at 1:31
Saksham VarmaSaksham Varma
1,774714
1,774714
add a comment |
add a comment |
This code may be helpful
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;
add a comment |
This code may be helpful
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;
add a comment |
This code may be helpful
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;
This code may be helpful
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;
answered Jun 29 '15 at 7:03
michael zxc858michael zxc858
20537
20537
add a comment |
add a comment |
One line solution:
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)]
add a comment |
One line solution:
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)]
add a comment |
One line solution:
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)]
One line solution:
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)]
answered Jun 5 '17 at 6:50
Vinayak KaniyarakkalVinayak Kaniyarakkal
7621220
7621220
add a comment |
add a comment |
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.
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']
add a comment |
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.
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']
add a comment |
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.
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']
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.
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']
answered Dec 3 '18 at 5:13
Siddharth SatpathySiddharth Satpathy
5841617
5841617
add a comment |
add a comment |
It can be done easily as
for value in [var1,var2,var3]:
li.append("targetValue")
add a comment |
It can be done easily as
for value in [var1,var2,var3]:
li.append("targetValue")
add a comment |
It can be done easily as
for value in [var1,var2,var3]:
li.append("targetValue")
It can be done easily as
for value in [var1,var2,var3]:
li.append("targetValue")
answered Nov 6 '18 at 14:26
SeenivasanSeenivasan
7741618
7741618
add a comment |
add a comment |
The most mnemonic way of representing your pseudo-code in Python would be:
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")
add a comment |
The most mnemonic way of representing your pseudo-code in Python would be:
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")
add a comment |
The most mnemonic way of representing your pseudo-code in Python would be:
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")
The most mnemonic way of representing your pseudo-code in Python would be:
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")
answered Aug 6 '18 at 6:26
rsalmeirsalmei
1698
1698
add a comment |
add a comment |
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
outputs
['c', 'd', 'f']
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:
sorted([chr(val + origo) for val in inputs])
add a comment |
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
outputs
['c', 'd', 'f']
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:
sorted([chr(val + origo) for val in inputs])
add a comment |
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
outputs
['c', 'd', 'f']
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:
sorted([chr(val + origo) for val in inputs])
Looks like you're building some kind of Caesar cipher.
A much more generalized approach is this:
input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]
outputs
['c', 'd', 'f']
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:
sorted([chr(val + origo) for val in inputs])
answered Aug 27 '18 at 9:45
firelynxfirelynx
14.9k36381
14.9k36381
add a comment |
add a comment |
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}:
add a comment |
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}:
add a comment |
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}:
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}:
answered Sep 20 '18 at 2:18
Md. Alamin MahamudMd. Alamin Mahamud
87711024
87711024
add a comment |
add a comment |
You can use dictionary :
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
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
add a comment |
You can use dictionary :
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
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
add a comment |
You can use dictionary :
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
You can use dictionary :
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
answered Jul 31 '18 at 16:54
Rohit GawasRohit Gawas
393
393
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
add a comment |
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
This may append same more then once this. Set?
– Sergei
Feb 19 at 4:49
add a comment |
Maybe you need direct formula for output bits set.
x=0 or y=0 or z=0 is equivalent to xyz = 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
lets map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
relation of isc:
if xyz=0 then isc=1 else isc=0
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:
logic and is sum of squares of equations
logic or is product of equations
and you'll have 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 element would correspond to ready string.
array[sum] gives you the string.
add a comment |
Maybe you need direct formula for output bits set.
x=0 or y=0 or z=0 is equivalent to xyz = 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
lets map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
relation of isc:
if xyz=0 then isc=1 else isc=0
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:
logic and is sum of squares of equations
logic or is product of equations
and you'll have 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 element would correspond to ready string.
array[sum] gives you the string.
add a comment |
Maybe you need direct formula for output bits set.
x=0 or y=0 or z=0 is equivalent to xyz = 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
lets map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
relation of isc:
if xyz=0 then isc=1 else isc=0
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:
logic and is sum of squares of equations
logic or is product of equations
and you'll have 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 element would correspond to ready string.
array[sum] gives you the string.
Maybe you need direct formula for output bits set.
x=0 or y=0 or z=0 is equivalent to xyz = 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
lets map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
relation of isc:
if xyz=0 then isc=1 else isc=0
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:
logic and is sum of squares of equations
logic or is product of equations
and you'll have 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 element would correspond to ready string.
array[sum] gives you the string.
edited Feb 18 at 10:57
answered Feb 17 at 17:55
SergeiSergei
1,76512035
1,76512035
add a comment |
add a comment |
protected by Martijn Pieters♦ Mar 8 '15 at 1:18
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
3
use
1
in (tuple)– Dante
Dec 5 '17 at 21:49
When you want to evaluate a list of statements in a any/all manner you can use
any
/all
functions. For example:all([1, 2, 3, 4, False])
will return Falseall([True, 1, 2, 3])
will return Trueany([False, 0, 0, False])
will return Falseany([False, 0, True, False])
will return True– eddd
Jun 4 '18 at 16:17
I did a summary post based on answers here: medium.com/codervlogger/…
– Kanan Rahimov
Feb 12 at 9:30