2016-09-30 11 views
1

まずpythonistasに、C/C++プログラマーがいくつかのPythonを行う必要があります。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

クリス

+0

この場合は辞書を使うことをお勧めします –

+0

なぜ 'GainSettings'のリストを使ってみませんか? –

+0

PequeとBrevnoのおかげで、最後はちょっとタイプミスでしたが、微妙でした。 Pythonプログラムを書く必要はほとんどありません。この場合、プラットフォームの独立性を確保するために、テストチームに任せてスクリプトを書くよりもはるかに上手く行かなくてはなりません。 申し訳ありませんが、誰かが強く入力することで育ったので、決してPythonを好きにならないでしょう:) –

答えて

0

私がコメントで言ったように、まずPythonはCではありません。私の提案は:それを利用して、あなた自身の利益のためにPythonを使用することです。 Cコードを模倣しようとしないでください。それは物事をより困難にするだけです。

一方、予期しない方法でリストを平坦化しています。私は思うの代わり:

Gains.extend(entry) 

あなたが欲しい:拡張としてRECORDTYPEをとりながら、

>>> 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()方法:

Gains.append(entry) 

が違いを参照してください。したがって、レコード型の各レコードの要素をリストに追加します。

Pythonは美しいプログラミング言語です。この機会を無駄にしないで、いくつかを学ぼうとしてください! ;-)

0

あなたは辞書が非空であれば、それは既にTrueで、Trueを返す必要はありません。 さて、今私はあなたがそれをC/C維持したい実現++のように、「このケースで私ができるので:私は、あなただけ

Gains[label] 

編集を使用して、それを処理

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

を示唆しています助けてください、申し訳ありません:)

1

私はあなたがこの文字列をチェックすべきだと思う:

ちょうど利益のリストに別の後にラベルと値1の両方を置く
Gains.extend(entry) 

はタプルを解凍が、あなたのリストにそれを全部追加しません

Gains.append(entry) 

を使用することを検討してください。

+0

あなたには例があり、より実証的です) – brevno

+0

今日はあなたが今日あなたに参加したことに気づいたので、ようこそ! ^^ – Peque

関連する問題