Я пытаюсь сделать функцию, которая будет сравнивать несколько переменных с целым числом и выводить строку из трех букв. Мне было интересно, если есть способ перевести это на 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"]
Возможно ли что-то подобное?
python
if-statement
comparison
match
boolean-logic
user1877442
источник
источник
1
в (кортеж)any
/all
functions. Например:all([1, 2, 3, 4, False])
вернет Falseall([True, 1, 2, 3])
вернет Trueany([False, 0, 0, False])
вернет Falseany([False, 0, True, False])
вернет Trueif x == 0 or 1:
, что, конечно, похожеif x or y == 0:
, но, тем не менее, может быть немного запутанным для новичков. Учитывая огромное количество "Почему я неx == 0 or 1
работаю?" вопросы, я бы предпочел использовать этот вопрос в качестве нашей цели канонического дублирования для этих вопросов.0
,0.0
илиFalse
. Вы можете легко написать неправильный код, который дает «правильный» ответ.Ответы:
Вы неправильно понимаете, как работают логические выражения; они не работают как английское предложение и предполагают, что вы говорите об одном и том же сравнении для всех имен здесь. Ты ищешь:
x
иy
в противном случае оцениваются самостоятельно (False
если0
, вTrue
противном случае).Вы можете сократить это, используя тест сдерживания для кортежа :
или еще лучше:
с помощью помощью
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 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}
.источник
set
версию. Кортежи очень дешевы в создании и повторении. По крайней мере, на моей машине кортежи работают быстрее, чем наборы, при условии, что размер кортежа составляет около 4-8 элементов. Если вам нужно сканировать больше, используйте набор, но если вы ищете предмет из 2-4 вариантов, кортеж будет еще быстрее! Если вы можете организовать для наиболее вероятного случая , чтобы быть первым в кортеже, выигрыш еще больше: (мой тест:timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))
)set
литеральной нотации для этого теста не является экономией, если содержимоеset
литерала также не является литералом, верно?if 1 in {x, y, z}:
не может кэшироватьset
, так какx
,y
иz
может измениться, поэтому либо потребности решение построитьtuple
илиset
с нуля, и я подозреваю , что все , что LookUp сбережения вы можете получить при проверке на членство будет завален большимset
временем создания.in [...]
илиin {...}
) работает только в том случае, если содержимое списка или набора также является неизменяемым литералом.Ваша проблема легче решается с помощью словарной структуры, такой как:
источник
d = "cdef"
что приводит кMyList = ["cdef"[k] for k in [x, y, z]]
map(lambda i: 'cdef'[i], [x, y, z])
[x, y, z]
Как утверждает Martijn Pieters, правильный и самый быстрый формат:
Используя его совет, теперь вы будете иметь отдельные операторы if, так что Python будет читать каждое утверждение независимо от того, были ли они первыми
True
илиFalse
. Такие как:Это будет работать, но если вам удобно пользоваться словарями (посмотрите, что я там делал), вы можете очистить это, сделав начальный словарь, отображающий числа в нужные вам буквы, а затем просто используя цикл for:
источник
Прямой способ записи
x or y or z == 0
являетсяНо я не думаю, тебе это нравится. :) И этот путь безобразен.
Другой способ (лучше):
Кстати, многие
if
s могут быть написаны как-то такисточник
dict
вместо ключа вы получите ошибки, потому что возвращаемое значение.append
- этоNone
, а вызовNone
даетAttributeError
. В целом я согласен с этим методом, хотя.filter
будет лучше, чемmap
, поскольку он вернет только те случаи, когда лямбда оценивается как истинаany(v == 0 for v in (x, y, z))
Если вы очень ленивы, вы можете поместить значения в массив. Такие как
Вы также можете поместить цифры и буквы в словарь и сделать это, но это, вероятно, намного сложнее, чем просто операторы if. Это то, что вы получаете за попытку быть очень ленивым :)
Еще одна вещь, ваш
будет компилироваться, но не так, как вы этого хотите. Когда вы просто помещаете переменную в оператор if (пример)
программа проверит, не является ли переменная нулевой. Другой способ написать вышеупомянутое утверждение (которое имеет больше смысла)
Bool - это встроенная функция в python, которая в основном выполняет команду проверки логического выражения (если вы не знаете, что это такое, это то, что вы пытаетесь сделать в своем выражении if прямо сейчас :))
Еще один ленивый способ, который я нашел:
источник
list
является встроенным Python; вместо этого используйте другое имя, какxyz
например. Почему вы построить список в четыре этапа , когда вы можете сделать один, то естьxyz = [x, y, z]
? Не используйте параллельные списки, вместо этого используйте dict. В общем, это решение гораздо более замысловатое, чем у ThatGuyRussell . Также в последней части, почему бы не сделать понимание, то естьany(v == 0 for v in (x, y, z))
? Также массивы - это что-то еще в Python.Чтобы проверить, содержится ли значение в наборе переменных, вы можете использовать встроенные модули
itertools
иoperator
.Например:
Импорт:
Объявите переменные:
Создайте отображение значений (в порядке, который вы хотите проверить):
Используйте,
itertools
чтобы разрешить повторение переменных:Наконец, используйте
map
функцию для создания итератора:Затем при проверке значений (в исходном порядке) используйте
next()
:так далее...
Это имеет преимущество перед тем,
lambda x: x in (variables)
чтоoperator
является встроенным модулем и является более быстрым и более эффективным, чем использование,lambda
которое должно создавать пользовательскую функцию на месте.Еще один вариант проверки наличия ненулевого (или ложного) значения в списке:
Эквивалент:
источник
Set - это хороший подход, потому что он упорядочивает переменные, что, по-видимому, и является вашей целью.
{z,y,x}
является{0,1,3}
то , что порядок параметров.Таким образом, все решение O (n).
источник
Все прекрасные ответы, представленные здесь, концентрируются на конкретных требованиях оригинального плаката и концентрируются на
if 1 in {x,y,z}
решении, предложенном Мартином Питерсом.Что они игнорируют, так это более широкий смысл вопроса:
как проверить одну переменную на множественные значения?
Предоставленное решение не будет работать для частичных попаданий, если используются строки, например:
Проверить, если строка «Wild» имеет несколько значений
или
для этого сценария проще всего преобразовать в строку
Однако следует отметить, что, как уже упоминалось
@codeforester
, при использовании этого метода границы слов теряются, например:3 буквы
rot
существуют в комбинации в списке, но не как отдельное слово. Проверка на «гниль» не удалась бы, но если бы один из элементов списка был «гнилой в аду», это тоже не сработало бы.В результате будьте внимательны с критериями поиска, если используете этот метод, и имейте в виду, что у него есть это ограничение.
источник
Я думаю, что это справится лучше:
Вывод:
источник
Если вы хотите использовать оператор if, else - это другое решение:
источник
источник
Этот код может быть полезен
источник
Вы можете попробовать метод, показанный ниже. В этом методе у вас будет свобода указывать / вводить количество переменных, которые вы хотите ввести.
источник
Одноканальное решение:
Или:
источник
Возможно, вам нужна прямая формула для набора выходных битов.
Давайте сопоставим на биты:
'c':1 'd':0xb10 'e':0xb100 'f':0xb1000
Отношение isc (is 'c'):
Используйте математическую формулу, если https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315
[С]:
(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]
дает вам строку.источник
Это можно сделать легко, как
источник
Наиболее мнемонический способ представления вашего псевдокода в Python:
источник
if any(v >= 42 for v in (x, y, z)):
). И выполнение всех 3 -х методов (2 in {x,y,z}
,2 in (x,y,z)
,any(_v == 2 for _v in (x,y,z))
) , кажется, почти то же самое в CPython3.6 (см GIST )Чтобы проверить несколько переменных с одним значением:
if 1 in {a,b,c}:
Чтобы проверить несколько значений с одной переменной:
if a in {1, 2, 3}:
источник
Похоже, вы создаете какой-то шифр Цезаря.
Гораздо более обобщенный подход заключается в следующем:
выходы
Не уверен, является ли это желаемым побочным эффектом вашего кода, но порядок вывода всегда будет отсортирован.
Если это то, что вы хотите, финальную строку можно изменить на:
источник
Вы можете использовать словарь:
источник
Без слов попробуйте это решение:
и дает:
источник
Это поможет вам.
источник
Вы можете объединить это
в одной переменной.
Изменить наши условия как:
Вывод:
источник
проблема
Хотя шаблон для тестирования нескольких значений
очень читабелен и работает во многих ситуациях, есть одна ловушка:
Но мы хотим иметь
Решение
Одно обобщение предыдущего выражения основано на ответе ytpillai :
который можно записать как
Хотя это выражение возвращает правильный результат, оно не так доступно для чтения, как первое выражение :-(
источник