Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 15, 2020 01:53:00

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

Вопрос касается работы оператора and cо списками булевых переменных
на примере списков с двумя элементами все работает вполне ожидаемо:

 l1 = [True, True]
l2 = [True, False]
print(l1 and l2 , l1 or l2)
>>> [True, False] [True, True]

но при реализации со списками размером по 10 элементов в каждом возникли проблемы

 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]
по каким-то неведомым причинам and отработал совсем не как ожидалось


пытался на практике при помощи таких операций запилить систему включения\выключения кнопок пользователю, а именно при помощи наложения маски на текущее (основное) состояние, при помощи простенькой функции приведенной ниже всем управлять, но столкнулся с описанной выше проблемой
 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

эту задачу конечно можно реализовать и кучей if-ов, но учитывая то что сигналов для включения-выключения множество, и часть из них после определенных действий требует возврата строго к прежнему состоянию ,я выбрал такой метод, если кто-то знает более адекватный буду рад любой инфе.



Офлайн

#2 Фев. 15, 2020 06:34:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

Операторы 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)

Офлайн

#3 Фев. 15, 2020 11:21:54

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

в ваших примерах нет списков с булевыми переменными, что and и or во всех остальных случаях работают корректно речи не шло, а вот с такими списками чертовщина как на скрине ниже
в ответе ожидалось увидеть

  [True, True, True, False, True, True, True, True, False, False]
а не все тру



нажмите для увеличения



Отредактировано @cckyi_boxxx (Фев. 15, 2020 11:27:22)

Офлайн

#4 Фев. 15, 2020 12:51:57

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

@cckyi_boxxx
по каким-то неведомым причинам and отработал совсем не как ожидалось
and работает правильно, смотрите в документацию x and y. if x is false, then x, else y если слева от and вычисляется как false, то вернёт то, что слева, в вашем случае слева находится непустой список который всегда вычисляется как true независимо от содержания и количества элементов, поэтому будет возвращено то, что находится справа.

Отредактировано rami (Фев. 15, 2020 12:53:56)

Офлайн

#5 Фев. 15, 2020 13:48:26

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

Спс, я думал со списками он для каждого элемента списка так сделает и вернет список попарно обработанных элементов, видимо без еще одного цикла или генератора это не запилить, но зато понятно где моя ошибка и как реализовать задуманное



Офлайн

#6 Фев. 15, 2020 19:25:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

 >>> 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]



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#7 Фев. 15, 2020 20:56:52

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

сенкс, уже запилил иначе

 [x & z for x,z in zip(mask, mask2)] # mask и mask2 - исходные списки



Офлайн

#8 Фев. 16, 2020 03:10:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9715
Репутация: +  842  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

@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)

Офлайн

#9 Март 7, 2020 16:17:14

Arushi
Зарегистрирован: 2020-03-07
Сообщения: 12
Репутация: +  -1  -
Профиль   Отправить e-mail  

Странное поведение с булевыми переменными

никогда не выпадала у меня такая проблема

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version