代码之家  ›  专栏  ›  技术社区  ›  Chris Aaaaa

Python-如何在列表中保留元素类型

  •  1
  • Chris Aaaaa  · 技术社区  · 9 年前

    首先向pythonsistas道歉,C/C++程序员必须执行一些python。

    我正在移植一些C(而不是C++),所以我本质上想创建一个结构列表,以通过串行端口传递给设备进行初始化、处理和写入。

    我将python保持在非常接近C的位置,因此当C更新时,python可能很容易获得相同的更新,因此这意味着它看起来像是程序性的,而且我意识到有些东西是毫无意义的,比如创建数组,将其传递给初始化并接收它(我知道我创建并传入的数组是多余的)

    我的问题是,当数组到达进行处理时,我的记录类型列表变成了一个平面列表,因此我无法再按名称访问记录类型的元素。

    我可以将它们转换回来(也就是从列表中重新创建每个元素),但我宁愿找出如何保持类型信息的完整性。

    我已将代码提取为以下内容:

    GainSettings = recordtype('GainSettings', 'label value')
    
    def init_arrays(Gains):
        labels = [ "Gain_1:", "Gain_2:", "Gain_48:" ]
        for itr in range(3):
            value = []
            value.extend([0] * CHANNELS)
            label = labels[itr]
            entry = GainSettings(label, value)
            Gains.extend(entry)
        return True, Gains
    
    def process_array(Gains):
        thing = Gains[0].label      # dies here with AttributeError: 'str' object has no attribute 'label'
        thing += "wibble"
        Gains[0].label = thing
        return True, Gains
    
    def main(args):
        # char*  label;
        # sint16 value[CHANNELS];
        Gains = []  # will be array of gain settings 
        ret, Gain = init_arrays(Gains)
        ret, Gains = process_array(Gains)
    

    我有一个断点,在那里它失败了,所以我可以检查数组,这告诉我:

    >>> print type(Gains)
    <type 'list'>
    >>> print Gains
    ['Gain_1:', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Gain_2:', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Gain_48:', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    <type 'list'>
    >>> print type(Gains[0])
    <type 'str'>
    >>> print type(Gains[1])
    <type 'list'>
    

    我想说这是一个“GainSettings”列表。

    实际上,有许多类似的数组,它们都有标签之类的公共项,处理函数应该采用任何类型的数组,并使用类似的部分来完成工作。

    TIA公司

    克里斯

    3 回复  |  直到 9 年前
        1
  •  1
  •   brevno    9 年前

    我认为你应该检查一下这个字符串:

    Gains.extend(entry)
    

    考虑使用

    Gains.append(entry)
    

    它不会解压缩元组,而是将其完整地附加到列表中。

        2
  •  0
  •   Peque Andrzej Pronobis    9 年前

    正如我在评论中所说,首先,Python不是C。我的建议是:利用它,为自己的利益使用Python。不要试图模仿C代码。这只会让事情变得更困难。

    Gains.extend(entry)
    

    您需要:

    Gains.append(entry)
    

    查看区别:

    >>> from recordtype import recordtype
    >>> A = recordtype('A', 'x y')
    >>> x = A(1, 2)
    
    # Extend
    >>> l = []
    >>> l.extend(x)
    >>> l
    [1, 2]
    
    # Append
    >>> l = []
    >>> l.append(x)
    >>> l
    [A(x=1, y=2)]
    

    方法 append() 将一个元素添加到列表中,而extend将recordtype作为一个可迭代的元素,因此,将recordtype中每个记录的元素添加到该列表中。

    Python是一种漂亮的编程语言。不要浪费这个机会,尝试学习一些!;-)

        3
  •  0
  •   Juraj Bezručka    9 年前

    您不必返回True,如果字典非空,则它已经是True。我建议你

    CHANNELS = 14
    def init_arrays():
        labels = [ "Gain_1:", "Gain_2:", "Gain_48:" ]
        return {lab: [0]* CHANNELS for lab in labels}
    

    然后您只需使用

    Gains[label]
    

    编辑: 好吧,现在我意识到你想让它保持C/C++的样子,所以在这种情况下,我帮不上忙,对不起:)