Python - 如何在列表

时间:2016-09-30 09:54:09

标签: python arrays recordtype

首先对不起pythonistas,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”列表。

实际上有许多类似的数组,它们有像label这样的常用项,处理函数应该采用任何类型的数组,并使用类似的部分来完成工作。

TIA

克里斯

3 个答案:

答案 0 :(得分:1)

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

Gains.extend(entry)

将标签和值一个接一个地放入Gains列表中。

考虑使用

Gains.append(entry)

不会解压缩元组,而是将其全部附加到列表中。

答案 1 :(得分:0)

您不必返回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 ++一样,所以在这种情况下我无法帮助,抱歉:)

答案 2 :(得分:0)

正如我在评论中所说,首先,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作为可迭代,因此,为记录类型中的每个记录添加元素到列表中。

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