【问题标题】:Python boolean list with fixed-ordered elements具有固定顺序元素的 Python 布尔列表
【发布时间】:2017-03-23 00:16:03
【问题描述】:

我正在尝试通过我用 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 的顺序?

[更新]

排除在“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)

提前致谢!

【问题讨论】:

    标签: python c++ list


    【解决方案1】:

    也许您只需要某种包装器。

    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
    

    当然可以更改方法命名。

    【讨论】:

      【解决方案2】:

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

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

      显示集合的示例:

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

      【讨论】:

        【解决方案3】:

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

        这是一个例子:

        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 上测试)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 2012-08-22
          • 2015-08-04
          • 2017-08-05
          • 2015-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多