具有固定排序元素的Python布尔列表

时间:2016-11-09 08:35:00

标签: python c++ list

我试图通过用LIGHTx命名的布尔变量来制作一些二进制信号系统。

LIGHT1 = True
LIGHT2 = True
LIGHT3 = False
LIGHT4 = False

接下来,我将这些变量嵌套到列表中以供将来计算,

signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4]

目前我正在使用Python: Boolean List to Binary StringConvert base-2 binary number string to int的想法将列表转换为我的信号的int号。这里,[1,1,0,0]表示12。

In [97]: boolList2BinString(signal)
Out[97]: 12

我的问题是:

  1. 如何自动更新"信号"的元素?通过更新LIGHT的值,而不是一次又一次地运行signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4]? Whitch表示,在我的其余代码中,我只需要运行LIGHTx = xxxxboolList2BinString(signal)。 (也许某种方式像C ++的指针?)
  2. 如果问题1不可能,我有什么方法可以修复列表中LIGHT的顺序吗?
  3. [更新]

    排除构建“'信号”的方式。列表中的' boolList2BinString'功能。

    原件:

    def boolList2BinString(lst):
        return int('0b' + ''.join(['1' if x else '0' for x in lst]), 2)
    

    内部构建:

    def boolList2BinString():
        osignal = [LIGHT1 , LIGHT2 , LIGHT3 , LIGHT4 ]
        return int('0b' + ''.join(['1' if x else '0' for x in signal ]), 2)
    

    提前致谢!

3 个答案:

答案 0 :(得分:0)

也许你只需要某种包装。

class Light(object):
    def __init__(self, state):
        self.state = state
    def false(self):
        self.state = False
    def true(self):
        self.state = True

LIGHT1 = Light(True)
LIGHT2 = Light(True)
LIGHT3 = Light(False)
LIGHT4 = Light(False)

signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4]

然后您只需将每个灯光的状态更改为LIGHT1.true()或LIGHT1.false(),signal列表中的值将自动更改。

LIGHT1.false()
LIGHT1.state  # False
LIGHT1.true()
LIGHT1.state  # True

当然,方法命名可以改变。

答案 1 :(得分:0)

你可以创建一个类来保存布尔值,然后它就像一个指针

>>> class Light:
...     def __init__(self, value):
...             self.value = value
...     def get(self):
...             return(self.value)
...     def set(self, value):
...             self.value = value

然后使用light.get()来获取值,或使用light.set()来设置值

>>> Light1 = light(True)
>>> Light2 = light(False)
>>> lights = [light1, light2]
>>> for l in lights:
...     print(l.get())
... 
True
False

示例显示set:

>>> for l in lights:
...     print(l.get())
... 
True
False

>>> light2.set(True)
>>> for l in lights:
...     print(l.get())
... 
True
True
>>> 

答案 2 :(得分:0)

您可以使用特殊属性类来设置整数位。

以下是一个例子:

class Light(property):
    def __init__(self, rank):
        self.rank= rank
        super(Light, self).__init__(self._get, self._set)
    def _get(self, signal):
        return (signal.value & (1 << self.rank)) != 0
    def _set(self, signal, value):
        if value:
            signal.value |= 1 << self.rank
        else:
            signal.value &= ~(1 << self.rank)

class Signal(object):
    def __init__(self, value=0):
        self.value = value
    l1 = Light(3)
    l2 = Light(2)

然后您可以使用它:

>>> s = Signal()
>>> s.value
0
>>> s.l1
False
>>> s.l1 = True
>>> s.l1
True
>>> s.value
8

(在Python 2.7和Python 3.5上测试)