Проблемы с & ldquo; или & rdquo; [Дубликат]

Существует несколько способов достижения этого

1. Конкатенация слэш

  var MultiLine=  '1\
    2\
    3\
    4\
    5\
    6\
    7\
    8\
    9';

2. регулярная конкатенация

var MultiLine = '1'
+'2'
+'3'
+'4'
+'5';

3. Array Присоединиться к конкатенации

var MultiLine = [
'1',
'2',
'3',
'4',
'5'
].join('');

Производительность, кратность конкатенации (первая) является самой быстрой.

См. этот тестовый пример для получения более подробной информации о производительности

Обновление:

С ES2015 мы можем воспользоваться функцией Template strings. С его помощью нам просто нужно использовать обратные тики для создания многострочных строк

Пример:

 `

{{title}}

{{hero.name}} details!

{{hero.id}}
{{hero.name}}
`

441
задан martineau 19 April 2018 в 20:25
поделиться

17 ответов

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

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}:

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

Когда вы используете or, питон видит каждая сторона оператора в виде отдельных выражений. Выражение 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}.

562
ответ дан Martijn Pieters 16 August 2018 в 05:28
поделиться
  • 1
    Я бы не стал так стремиться к версии set. Tuple очень дешевы для создания и повторения. По крайней мере на моей машине кортежи быстрее, чем наборы, если размер кортежа составляет около 4-8 элементов. Если вам нужно сканировать больше, используйте набор, но если вы ищете предмет из 2-4 возможностей, кортеж все еще быстрее! Если вы можете организовать наиболее вероятный случай, чтобы быть первым в кортеже, выигрыш еще больше: (мой тест: timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1))))) – SingleNegationElimination 24 October 2013 в 16:27
  • 2
    @dequestarmappartialsetattr: в Python 3.3 и выше набор хранится как константа, минуя время создания, устраняя время создания. Кортежи могут быть дешевыми, чтобы создавать, поскольку Python кэширует их, чтобы избежать отторжения памяти, что делает большую разницу с множествами здесь. – Martijn Pieters♦ 24 October 2013 в 16:29
  • 3
    @dequestarmappartialsetattr: если время just , критерий принадлежности, для целых наборов и наборов одинаково быстро для идеального сценария; соответствующий первому элементу. После этого кортежи проигрывают множеству. – Martijn Pieters♦ 24 October 2013 в 16:37
  • 4
    Ого. Я никогда не понимал, что есть буквальное множество обозначений. Как долго это было? Все это время я писал set(x, y, z), я мог бы сэкономить 3 персонажа. Мне показалось странным, что есть что-то такое основное, чего я никогда не видел за годы, которые я использовал Python. – ArtOfWarfare 13 April 2015 в 20:27
  • 5
    @MartijnPieters: Использование литерала set для этого теста не является экономией, если содержимое set -литерала также не является литералом, верно? if 1 in {x, y, z}: не может кэшировать set, потому что x, y и z могут измениться, поэтому любое решение должно построить tuple или set с нуля, и я подозреваю, вы можете получить, когда проверка членства будет завалена большим временем создания set. – ShadowRanger 4 September 2016 в 00:37

Прямым способом записи 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
22
ответ дан akaRem 16 August 2018 в 05:28
поделиться
  • 1
    В вашем примере dict вместо ключа вы получите ошибки, потому что возвращаемое значение .append равно None, а вызов None дает AttributeError. В общем, я согласен с этим методом. – SethMMorton 8 February 2014 в 22:57

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

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

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

14
ответ дан B. M. 16 August 2018 в 05:28
поделиться
  • 1
    Вы должны добавить описание того, что выполняет ваш код и как он это делает. Короткие ответы с использованием только кода не рекомендуется – Raniz 10 June 2015 в 04:19

Чтобы проверить, содержится ли значение в наборе переменных, вы можете использовать встроенные модули 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))
14
ответ дан GuiltyDolphin 16 August 2018 в 05:28
поделиться
  • 1
    Это не отвечает на вопрос ОП. Он охватывает только первый случай в приведенном примере. – wallacer 4 June 2014 в 18:39

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

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;
11
ответ дан michael zxc858 16 August 2018 в 05:28
поделиться

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

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
55
ответ дан River 16 August 2018 в 05:28
поделиться
  • 1
    Или даже d = "cdef", что приводит к MyList = ["cdef"[k] for k in [x, y, z]] – aragaer 24 October 2013 в 16:39
  • 2
    или map(lambda i: 'cdef'[i], [x, y, z]) – dansalmo 8 May 2014 в 15:36
  • 3
    @MJM порядок вывода не определяется dict, он определяется порядком списка [x, y, z] – dansalmo 24 July 2018 в 21:05
  • 4
    Конечно! Я определенно неправильно понял что-то, как я прокручивал. kudos @dansalmo (кстати, я удалил сообщение, чтобы не вызвать путаницу) – MJM 25 July 2018 в 08:22

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

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
ответ дан Rohit Gawas 16 August 2018 в 05:28
поделиться

Все превосходные ответы, представленные здесь, сосредоточены на специфических требованиях оригинального плаката и сосредоточены на решении 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 существуют в комбинации в списке, но не как отдельное слово. Тестирование на «гниль» потерпит неудачу, но если один из элементов списка будет «гнить в аду», это тоже не удастся. Если вы используете этот метод, будьте осторожны с вашими критериями поиска и имейте это в виду.

13
ответ дан Rolf of Saxony 16 August 2018 в 05:28
поделиться
  • 1
    С помощью "преобразования в строку" подход, мы теряем границы слов, а проверка in может быть неправильной. – codeforester 21 June 2018 в 21:08
  • 2
    @codeforester Ваша точка зрения справедлива, и я расскажу об этом в ответе. – Rolf of Saxony 22 June 2018 в 07:41

Самый мнемонический способ представления вашего псевдокода в 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")
0
ответ дан rsalmei 16 August 2018 в 05:28
поделиться
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]
11
ответ дан Saksham Varma 16 August 2018 в 05:28
поделиться

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

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
13
ответ дан shuttle87 16 August 2018 в 05:28
поделиться

Предыдущее решение: Как заявил 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])
32
ответ дан ThatGuyRussell 16 August 2018 в 05:28
поделиться

Если вы хотите использовать 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)
13
ответ дан Vallentin 16 August 2018 в 05:28
поделиться

Однолинейное решение:

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)]
3
ответ дан Vinayak Kaniyarakkal 16 August 2018 в 05:28
поделиться

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

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])
18
ответ дан ytpillai 16 August 2018 в 05:28
поделиться
0
ответ дан firelynx 6 September 2018 в 04:05
поделиться
0
ответ дан Md. Alamin Mahamud 29 October 2018 в 10:39
поделиться
Другие вопросы по тегам:

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