Как проверить несколько переменных на значение?

Я пытаюсь сделать функцию, которая будет сравнивать несколько переменных с целым числом и выводить строку из трех букв. Мне было интересно, есть ли способ перевести это на 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"]

Возможно ли подобное?

+534
27 февр. '13 в 12:26
источник поделиться
23 ответа

Вы неправильно понимаете, как работают булевы выражения; они не работают как английское предложение и предполагают, что вы говорите о том же сравнении для всех имен здесь. Ты ищешь:

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

x и y иначе оцениваются самостоятельно (False если 0, True противном случае).

Вы можете сократить это, используя тест сдерживания против кортежа:

if 1 in (x, y, z):

или еще лучше:

if 1 in {x, y, z}:

используя set чтобы воспользоваться тестом на членство в постоянной стоимости (in течение фиксированного периода времени, независимо от левого операнда).

Когда вы используете or, python видит каждую сторону оператора в виде отдельных выражений. Выражение x or y == 1 рассматривается как первый булевой тест для x, тогда, если это False, выполняется проверка y == 1.

Это связано с приоритетом оператора. Оператор or имеет более низкий приоритет, чем тест ==, поэтому последний сначала оценивается.

Однако, даже если бы это было не так, и выражение x or y or z == 1 было фактически интерпретировано как (x or y or z) == 1, это все равно не будет делать то, что вы ожидаете от него.

x or y or z будут оценивать первый аргумент, который является "правдивым", например, не False, числовым 0 или пустым (см. булевские выражения для получения подробной информации о том, что Python считает ложным в булевом контексте).

Таким образом, для значений x = 2; y = 1; z = 0 x = 2; y = 1; z = 0 x = 2; y = 1; z = 0, x or y or z разрешат до 2, потому что это первое истинное значение в аргументах. Тогда 2 == 1 будет False, хотя y == 1 будет True.

То же самое относится к обратному; тестирование нескольких значений по одной переменной; x == 1 or 2 or 3 сбой по тем же причинам. Используйте x == 1 or x == 2 or x == 3 или x in {1, 2, 3}.

+706
27 февр. '13 в 12:27
источник

Ваша проблема легче решать со структурой словаря, например:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
+84
11 июл. '13 в 21:56
источник

Связанные вопросы


Похожие вопросы

Как утверждает Martijn Pieters, правильный и самый быстрый формат:

if 1 in {x, y, z}:

Используя его совет, вы теперь получили бы отдельные операторы if, чтобы Python читал каждое утверждение независимо от того, было ли это True или False. Такие как:

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

Это будет работать, но если вам удобно пользоваться словарями (посмотрите, что я там делал), вы можете очистить это, сделав начальный словарь, отображающий числа в нужные вам буквы, а затем просто используя цикл for:

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])
+55
19 авг. '15 в 2:34
источник

Прямым способом записи x or y or z == 0 является

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

Но я не думаю, вам это нравится.:) И этот путь уродлив.

Другой способ (лучше):

0 in (x, y, z)

BTW много if может быть написано как-то вроде этого

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break
+40
11 июл. '13 в 21:16
источник

Если вы очень ленивы, вы можете поместить значения внутри массива. Например,

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

Вы также можете поместить числа и буквы в словарь и сделать это, но это, вероятно, намного сложнее, чем просто инструкции. Это то, что вы пытаетесь сделать лишним ленивым:)

Еще одна вещь, ваш

if x or y or z == 0:

будет компилироваться, но не так, как вы хотите. Когда вы просто помещаете переменную в оператор if (пример)

if b

программа проверяет, не является ли переменная нулевой. Другой способ написать вышеприведенное утверждение (что имеет больше смысла) - это

if bool(b)

Bool - встроенная функция в python, которая в основном выполняет команду проверки логического оператора (если вы не знаете, что это такое, это то, что вы пытаетесь сделать в своем операторе if прямо сейчас:))

Другим ленивым способом я нашел:

if any([x==0, y==0, z==0])
+28
25 мая '15 в 3:53
источник

Чтобы проверить, содержится ли значение в наборе переменных, вы можете использовать встроенные модули itertools и operator.

Например:

Импорт

from itertools import repeat
from operator import contains

Объявить переменные:

x = 0
y = 1
z = 3

Создать сопоставление значений (в порядке, который вы хотите проверить):

check_values = (0, 1, 3)

Используйте itertools, чтобы разрешить повторение переменных:

check_vars = repeat((x, y, z))

Наконец, используйте функцию map для создания итератора:

checker = map(contains, check_vars, check_values)

Затем, проверяя значения (в исходном порядке), используйте next():

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

и т.д...

Это имеет преимущество перед lambda x: x in (variables), потому что operator является встроенным модулем и работает быстрее и эффективнее, чем с помощью lambda, который должен создать пользовательскую функцию на месте.

Другая опция для проверки наличия ненулевого (или False) значения в списке:

not (x and y and z)

Эквивалент:

not all((x, y, z))
+26
04 июн. '14 в 17:09
источник

Если вы хотите использовать if, else следующие утверждения - это другое решение:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)
+24
10 апр. '15 в 3:29
источник

Я думаю, что это справится с этим лучше:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

Вывод:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
+24
13 янв. '15 в 12:10
источник

Все превосходные ответы, представленные здесь, сосредоточены на специфическом требовании оригинального плаката и сосредоточены на решении if 1 in {x,y,z} решении if 1 in {x,y,z} предложенном Мартином Питером.
То, что они игнорируют, является более широким следствием вопроса:
Как проверить одну переменную на несколько значений?
Предоставленное решение не будет работать для частичных ударов, если использовать строки, например:
Проверьте, есть ли строка "Wild" в нескольких значениях

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 

или

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
... 

для этого сценария проще всего преобразовать в строку

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

Однако следует отметить, что, как упоминалось в @codeforester, эти @codeforester слова теряются с помощью этого метода, как в:

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

3 буквы rot существуют в комбинации в списке, но не как отдельное слово. Тестирование на "гниль" потерпит неудачу, но если один из элементов списка будет "гнить в аду", это тоже не удастся.
В результате, будьте осторожны с критериями поиска, если используете этот метод, и помните, что оно имеет это ограничение.

+24
10 сент. '16 в 15:44
источник

Набор - хороший подход здесь, потому что он заказывает переменные, что кажется вашей целью здесь. {z,y,x} - {0,1,3} независимо от порядка параметров.

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

Таким образом, все решение O (n).

+24
09 июн. '15 в 20:46
источник

Этот код может быть полезен

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;
+21
29 июн. '15 в 7:03
источник
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]
+21
27 февр. '15 в 1:31
источник

Однострочное решение:

mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]

Или:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
+7
05 июн. '17 в 6:50
источник

Вы можете попробовать метод, показанный ниже. В этом методе у вас будет возможность указать/ввести количество переменных, которые вы хотите ввести.

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']
+6
03 дек. '18 в 5:13
источник

Возможно, вам нужна прямая формула для набора выходных битов.

x=0 or y=0 or z=0   is equivalent to x*y*z = 0

x=1 or y=1 or z=1   is equivalent to (x-1)*(y-1)*(z-1)=0

x=2 or y=2 or z=2   is equivalent to (x-2)*(y-2)*(z-2)=0

Пусть отображает в биты: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

Отношение isc (is 'c'):

if xyz=0 then isc=1 else isc=0

Используйте математическую формулу, если 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))

...

Соедините эти формулы, используя следующую логику:

  • логика and есть сумма квадратов уравнений
  • логика or является продуктом уравнений

и вы будете иметь общую сумму экспресс-сумму, и у вас есть общая формула суммы

тогда сумма & 1 - это c, сумма & 2 - это d, сумма & 4 - это e, сумма & 5 - это f

После этого вы можете сформировать предопределенный массив, где индекс строковых элементов будет соответствовать готовой строке.

array[sum] дает вам строку.

+4
17 февр. '19 в 17:55
источник

Это можно сделать легко, так как

for value in [var1,var2,var3]:
     li.append("targetValue")
+4
06 нояб. '18 в 14:26
источник

Чтобы проверить несколько переменных с одним единственным значением: if 1 in {a,b,c}:

Чтобы проверить несколько значений с одной переменной: if a in {1, 2, 3}:

+3
20 сент. '18 в 2:18
источник

Самый мнемонический способ представления вашего псевдокода в Python:

x = 0
y = 1
z = 3
mylist = []

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")
+3
06 авг. '18 в 6:26
источник

Похоже, вы строите какой-то шифр Цезаря.

Это гораздо более обобщенный подход:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

выходы

['c', 'd', 'f']

Не уверен, что это желаемый побочный эффект вашего кода, но порядок вашего вывода всегда будет отсортирован.

Если это то, что вы хотите, окончательную строку можно изменить на:

sorted([chr(val + origo) for val in inputs])
+3
27 авг. '18 в 9:45
источник

Это поможет вам.

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);
+3
05 апр. '19 в 22:03
источник

Вы можете использовать словарь:

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
+1
31 июл. '18 в 16:54
источник
x = 0
y = 1
z = 3

k = [x,y,z]


v = {0:'c',1:'d',2:'e',3:'f'}


n = [v.get(i) for i in k]

print(n)

#### Output ####
['c', 'd', 'f']
0
26 апр. '19 в 6:25
источник

Не слишком усложняйтесь, просто следуйте самым простым способом.

 x = 0
 y = 1
 z = 3

 Mylist = []

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

Ура!

0
16 июн. '16 в 13:03
источник

Посмотрите другие вопросы по меткам или Задайте вопрос