Python - 如何在列表中保留元素类型
Python - howto keep type of elements in list
首先向 pythonistas 道歉,C/C++ 程序员不得不做一些事情 python。
我正在移植一些 C(不是 C++),所以我基本上想创建一个结构列表来传递以进行初始化、处理和通过串行端口写入设备。
我将 python 保持在与 C 非常接近的位置,因此当更新 C 时,python 可能很容易获得相同的更新,所以这意味着它看起来是程序性的并且有一些东西我realize 是废话,像创建一个数组,传出去初始化再接收回来(我理解我创建传入的那个是多余的)
我的问题是当数组到达要处理的时候,我的记录类型列表变成了一个平面列表,所以我不能再按名称访问我的记录类型的元素。
我可以将它们转换回去(也就是重新创建列表中的每个元素),但我更愿意弄清楚如何保持类型信息的完整性。
我已将代码提炼为以下内容:
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
克里斯
您不必 return 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++ 之类的,所以在这种情况下我无能为力,抱歉:)
正如我在评论中所说,首先,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 是一种美丽的编程语言。不要浪费这个机会并尝试学习一些! ;-)
我认为你应该检查这个字符串:
Gains.extend(entry)
这只是将标签和值一个接一个地放入增益列表中。
考虑使用
Gains.append(entry)
这不会解压元组,而是将其整个附加到您的列表中。
首先向 pythonistas 道歉,C/C++ 程序员不得不做一些事情 python。
我正在移植一些 C(不是 C++),所以我基本上想创建一个结构列表来传递以进行初始化、处理和通过串行端口写入设备。
我将 python 保持在与 C 非常接近的位置,因此当更新 C 时,python 可能很容易获得相同的更新,所以这意味着它看起来是程序性的并且有一些东西我realize 是废话,像创建一个数组,传出去初始化再接收回来(我理解我创建传入的那个是多余的)
我的问题是当数组到达要处理的时候,我的记录类型列表变成了一个平面列表,所以我不能再按名称访问我的记录类型的元素。
我可以将它们转换回去(也就是重新创建列表中的每个元素),但我更愿意弄清楚如何保持类型信息的完整性。
我已将代码提炼为以下内容:
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
克里斯
您不必 return 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++ 之类的,所以在这种情况下我无能为力,抱歉:)
正如我在评论中所说,首先,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 是一种美丽的编程语言。不要浪费这个机会并尝试学习一些! ;-)
我认为你应该检查这个字符串:
Gains.extend(entry)
这只是将标签和值一个接一个地放入增益列表中。
考虑使用
Gains.append(entry)
这不会解压元组,而是将其整个附加到您的列表中。