2016-09-30 64 views
1

對不起,首先是pythonistas,C/C++程序員必須做一些python。Python - howto保持列表中的元素類型

我正在移植一些C(而不是C++),所以我基本上想創建一個結構列表來傳遞初始化,處理並通過串口寫入設備。

我保持python非常接近C,所以當C更新時,python可能很容易得到相同的更新,所以這意味着它看起來程序化,並且我認識到的一些東西是廢話,比如創建一個數組,傳遞它初始化並接收它(我明白,我創建並通過進入的是多餘的)

我的問題是,當數組到達要處理時,我的列表recordtype已成爲一個平面列表,所以我不能再通過名稱訪問我的記錄類型的元素。

我可以將它們轉換回來(又名從列表中重新創建每個元素),但我寧願制定如何保持類型信息不變。

我已經蒸的代碼如下:

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

我會把它想說這是一個「增益設置」列表。

實際上有很多類似的數組,他們有像標籤這樣的常見項,處理函數應該採用任何類型的數組並使用相似的部分來完成工作。

TIA

克里斯

+0

我會建議在這種情況下使用字典 –

+0

爲什麼不使用'GainSettings'列表? –

+0

感謝Peque和Brevno,最後只是一個錯字,但很微妙,感謝您的發現。 我很少必須編寫一個python程序,在這種情況下,爲了方便平臺獨立性,它應該由測試團隊來維護,它們不會超越腳本。 對不起,因爲有人提出強打字,我永遠不會愛蟒蛇:) –

回答

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()添加到列表中的元素的方法,同時延長取RECORDTYPE作爲可迭代的,因此,爲記錄類型中的每個記錄添加元素到列表中。

Python是一種漂亮的編程語言。不要浪費這個機會,並嘗試學習一些! ;-)

0

您不必返回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++一樣,所以在這種情況下,我可以」幫助,對不起:)

1

我認爲你應該檢查這個字符串:

Gains.extend(entry) 

這只是把標籤和值陸續進入漲幅榜。

考慮使用

Gains.append(entry) 

,不會把它解析,但其追加整到你的列表中。

+0

你提供了一個例子,更具說明性) – brevno

+0

我剛剛注意到你今天加入了SO,所以歡迎! ^^ – Peque