Я пытаюсь сделать функцию, которая будет сравнивать несколько переменных с целым числом и выводить строку из трех букв. Мне было интересно, есть ли способ перевести это на 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"]
Возможно ли что-то подобное?
Прямым способом записи 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 s может быть написано как нечто подобное
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
Set - хороший подход здесь, потому что он заказывает переменные, что кажется вашей целью здесь. {z,y,x} - {0,1,3} независимо от порядка параметров.
>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']
Таким образом, все решение O (n).
Чтобы проверить, содержится ли значение в наборе переменных, вы можете использовать встроенные модули 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))
Этот код может быть полезен
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;
Ваша проблема легче решать со структурой словаря, например:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
Вы можете использовать словарь:
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
Все превосходные ответы, представленные здесь, сосредоточены на специфических требованиях оригинального плаката и сосредоточены на решении 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, эти граничные слова теряются с помощью этого метода, как в:
>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
...
True
3 буквы rot существуют в комбинации в списке, но не как отдельное слово. Тестирование на «гниль» потерпит неудачу, но если один из элементов списка будет «гнить в аду», это также потерпит неудачу. [D1] . Выражаясь, будьте осторожны с вашими критериями поиска, если используете этот метод и что он имеет это ограничение.
Самый мнемонический способ представления вашего псевдокода в 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")
Я думаю, что это лучше справится с этим:
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
Предыдущее решение: Как заявил Martijn Pieters, правильный и самый быстрый формат:
if 1 in {x, y, z}:
. Одна из основных проблем, которая, похоже, не рассматривается, заключается в том, что вы хотите, чтобы ваш список результатов включают каждое письмо после утверждения if. Используя только совет Martijn Pieters, вы теперь имеете:
if 0 in {x, y, z}:
Mylist.append("c")
elif 1 in {x, y, z}:
Mylist.append("d")
...
Предыдущее решение: Первый оператор if вернет true, и вы никогда не получите следующий оператор elif. Таким образом, ваш список просто вернется:
["c"]
То, что вы хотите, состоит в том, чтобы иметь отдельные операторы if, чтобы python считывал каждое утверждение, были ли первые правильными или ложными. Например:
if 0 in {x, y, z}:
Mylist.append("c")
if 1 in {x, y, z}:
Mylist.append("d")
if 2 in {x, y, z}:
Mylist.append("e")
...
Это будет работать, но «если» вам удобно использовать словари (см. То, что я там сделал), вы можете очистить это, сделав начальный словарь, сопоставляющий числа с буквами вы хотите, а затем просто используйте цикл 'for':
numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
if number in {x, y, z}:
Mylist.append(numToLetters[number])
Если вы хотите использовать 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)
Однолинейное решение:
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)]
Если вы очень ленивы, вы можете поместить значения внутри массива. Например,
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])