Форум сайта python.su
Вопрос касается работы оператора and cо списками булевых переменных
на примере списков с двумя элементами все работает вполне ожидаемо:
l1 = [True, True] l2 = [True, False] print(l1 and l2 , l1 or l2) >>> [True, False] [True, True]
print([True, True, True, False, True, True, True, True, False, False] and [True, True, True, True, True, True, True, True, True, True]) >>> [True, True, True, True, True, True, True, True, True, True]
def set_controls_state(self, mask): prev = list() # в отдельных случаях надо будет вернуться к прежнему состоянию for x, z in zip(mask, self.controls): # self.controls == список кнопок состоянием которых управляем prev.append(z.isEnabled()) z.setEnabled(x) return prev
Офлайн
Операторы and и or работают ровно так как описано в документации.
l1 = ["Петя"] l2 = ["Маша"] print(l1 and l2 , l1 or l2) bl1=0b1100 bl2=0b1010 print(bin(bl1 & bl2), bin(bl1 | bl2)) import numpy as np l1=np.array([1,1,0,0]) l2=np.array([1,0,1,0]) print(l1 & l2, l1 | l2) ['Маша'] ['Петя'] 0b1000 0b1110 [1 0 0 0] [1 1 1 0]
Отредактировано doza_and (Фев. 15, 2020 06:38:22)
Офлайн
в ваших примерах нет списков с булевыми переменными, что and и or во всех остальных случаях работают корректно речи не шло, а вот с такими списками чертовщина как на скрине ниже
в ответе ожидалось увидеть
[True, True, True, False, True, True, True, True, False, False]
Отредактировано @cckyi_boxxx (Фев. 15, 2020 11:27:22)
Офлайн
@cckyi_boxxxand работает правильно, смотрите в документацию x and y. if x is false, then x, else y если слева от and вычисляется как false, то вернёт то, что слева, в вашем случае слева находится непустой список который всегда вычисляется как true независимо от содержания и количества элементов, поэтому будет возвращено то, что находится справа.
по каким-то неведомым причинам and отработал совсем не как ожидалось
Отредактировано rami (Фев. 15, 2020 12:53:56)
Офлайн
Спс, я думал со списками он для каждого элемента списка так сделает и вернет список попарно обработанных элементов, видимо без еще одного цикла или генератора это не запилить, но зато понятно где моя ошибка и как реализовать задуманное
Офлайн
>>> s1 = [True, False, False] >>> s2 = [False, False, True] >>> from operator import and_, or_ >>> list(map(and_, s1, s2)) [False, False, False] >>> list(map(or_, s1, s2)) [True, False, True]
Онлайн
сенкс, уже запилил иначе
[x & z for x,z in zip(mask, mask2)] # mask и mask2 - исходные списки
Офлайн
@cckyi_boxxxДа, ты просто не правильно думал.
я думал со списками он для каждого элемента списка так сделает и вернет список попарно обработанных элементов
@cckyi_boxxxДа, ты просто не понял, как оно на самом деле работает.
на примере списков с двумя элементами все работает вполне ожидаемо:
@cckyi_boxxxДа, это правильный подход. В случае установки флажков нужно использовать биты в числе по степени двойки. Степени двойки я у тебя не вижу только, а это важный момент.
уже запилил иначе
>>> buttons = 0 >>> >>> COLOR_GREEN = 0x1 >>> COLOR_RED = 0x2 >>> COLOR_YELLOW = 0x4 >>> COLOR_BLUE = 0x8 >>> COLOR_ORANGE = 0x10 >>> COLOR_WHITE = 0x20 >>> COLOR_BROWN = 0x40 >>> COLOR_VIOLET = 0x80 >>> COLOR_BLACK = 0x100 >>> COLOR_NEXT = 0x200 >>> >>> buttons |= COLOR_BLACK >>> buttons |= COLOR_WHITE >>> buttons |= COLOR_RED >>> buttons |= COLOR_GREEN >>> buttons |= COLOR_BLUE >>> buttons |= COLOR_ORANGE >>> buttons |= COLOR_VIOLET >>> buttons |= COLOR_YELLOW >>> buttons |= COLOR_BROWN >>> >>> buttons 511 >>> bin(buttons) '0b111111111' >>> >>> print('See black', bool(buttons & COLOR_BLACK)) See black True >>> >>> print('See yellow', bool(buttons & COLOR_YELLOW)) See yellow True >>> >>> print('See next', bool(buttons & COLOR_NEXT)) See next False >>>
Отредактировано py.user.next (Фев. 16, 2020 03:19:16)
Офлайн
никогда не выпадала у меня такая проблема
Офлайн