0

次の辞書のタプルがあります。

td=({'associatedFrame': None,
     'cyclicModeNumber': None,
     'description': 'Increment     10: Arc Length =   7.2813E-02',
     'domain': 'ARC_LENGTH',
     'fieldOutputs': 'Repository object',
     'frameId': 10,
     'frameValue': 0.0728124976158142,
     'frequency': None,
     'incrementNumber': 10,
     'isImaginary': False,
     'loadCase': None,
     'mode': None})

key に関連付けられた値を取得したいと思いますframeId。私はタプルと辞書の経験があまりなく、見つけた質問はタプルの辞書に関するものだったので、あなたの助けを求めます。ありがとう

編集:実際、私はすでにあなたのソリューションを試していましたが、別のプログラムから結果を取得するために python を使用していることを忘れていました。このプログラムには特定の組織があるため、機能するためにはtd.frameId.

4

6 に答える 6

1

これが本当にあなたが持っているものなら、それはただの辞書です。

td['frameId']

動作します。括弧はタプルを作りません。コンマはタプルを作るものです。

foo = (1) #integer
foo = (1,) #1 element tuple
foo = 1, #1 element tuple

括弧が必要になるのは、構文があいまいになるいくつかの状況 (関数呼び出しなど) だけです。明らかに:

foo(1,2,3)

とは異なります。

foo(1,(2,3))

実際に がある場合はtuple、必要なアイテムを取得するためにインデックスを作成できる辞書を取得するためにインデックスを作成する必要があります。

td[0]['frameId']
于 2013-05-09T15:18:40.407 に答える
1

それはタプルではなく、ただの静かなdictものです...つまり、(役に立たない)括弧内の辞書です。

td['frameId']キーを検索します。

ノート:

({'this': 'would be a dict in a tuple'},)

于 2013-05-09T15:19:04.370 に答える
1

リスト内包表記を使用できます。

matches = [ d for d in td if d['frameID'] == DESIRED_VALUE ]

td(実際には複数の辞書があると仮定します。例は、冗長な括弧のペア内の単一の辞書です。)

于 2013-05-09T15:19:05.060 に答える
1

辞書のタプルを使用していません。td は辞書自体です。次に、でtd値を取得したい場合td['frameId']

于 2013-05-09T15:19:13.117 に答える
1
td=({'associatedFrame': None,
     'cyclicModeNumber': None,
     'description': 'Increment     10: Arc Length =   7.2813E-02',
     'domain': 'ARC_LENGTH',
     'fieldOutputs': 'Repository object',
     'frameId': 10,
     'frameValue': 0.0728124976158142,
     'frequency': None,
     'incrementNumber': 10,
     'isImaginary': False,
     'loadCase': None,
     'mode': None})

print(td['frameId'])

を見逃したのかもしれません''

于 2013-05-09T15:19:47.837 に答える
0

簡単な答え:

td.get('frameId')

長い答え:

実はとっても簡単!タプルは Python では不変オブジェクトと見なされます (別名、一度作成すると、変更を加えることができなくなります) が、辞書は Python でハッシュ テーブルを実行する方法です。

それはさておき、あなたの例はタプルではありません。

Python のタプルを作成するには、次のようにする必要があります。

td=({'associatedFrame': None, 'cyclicModeNumber': None, 'description': 'Increment     10: Arc Length =   7.2813E-02', 'domain': 'ARC_LENGTH', 'fieldOutputs': 'Repository object', 'frameId': 10, 'frameValue': 0.0728124976158142, 'frequency': None, 'incrementNumber': 10, 'isImaginary': False, 'loadCase': None, 'mode': None},)

あなたが尋ねる違いは何ですか?,辞書の右中かっこの後と最後の括弧の前の末尾を参照してください。これはタプルを作成する Python の方法です。あなたが持っているのは、括弧で囲まれた PURE Python 辞書です。括弧は実際には何もしていません。 注意: この場合、タプルには 1 つの要素しかないため、末尾のコンマが必要です。複数の要素がある場合、末尾のコンマは必要ありません。

しかし、タプル内にネストされたディクショナリが必要であり、それを正しく行ったと仮定しましょ。最初に、タプル内のディクショナリにアクセスする必要があります。これはindexを使用して実現されます。

したがって、たとえば、次の場合

sampleTuple = ([0, 1, 2], "abc", {"test": "meout", "again": "andagain"})

別の言い方をすれば、慣用的なプロトプログラミング命名法 (=P) では、次のようになります。

sampleTuple = (LIST_OBJECT, STIRNG_OBJECT, DICTIONARY_OBJECT)

次のようにして、最初の要素 (LIST_OBJECT) にアクセスできます。

sampleTuple[0]

これはリストを返します:

[0, 1, 2]

注意: 最初の要素は、その「オフセット」値によって参照されます。この場合、「0」のオフセットはタプルの開始を表します。

2 番目の要素に到達するには、次のようにします。

sampleTuple[1]

これにより、次の文字列が返されます。

"abc"

などなど…。

次のようになります。

Index Values   |-----0----|  |-----1-----|  |-------2--------|
sampleTuple = (LIST_OBJECT, STIRNG_OBJECT, DICTIONARY_OBJECT)

あなたの場合(トライアルコンマがあった場合)、タプル内にネストされたオブジェクト(辞書)が1つあります。したがって、上記と同じタイプの「オフセット」アプローチを実行して、アクセスする必要があります。

td[0]

これにより、辞書が生成されます。

{'associatedFrame': None, 
'cyclicModeNumber': None, 
'description': 'Increment     10: Arc Length =   7.2813E-02', 
'domain': 'ARC_LENGTH', 
'fieldOutputs': 'Repository object', 
'frameId': 10, 
'frameValue': 0.0728124976158142, 
'frequency': None, 
'incrementNumber': 10, 
'isImaginary': False, 
'loadCase': None, 'mode': None}

さて、楽しい部分は Python で辞書メソッドを使用することです。いくつかの方法がありますが、「最も安全な」方法は を使用することdict.get()です。

これは私のサンプル出力です...

>>> td=({'associatedFrame': None, 'cyclicModeNumber': None, 'description': 'Increment     10: Arc Length =   7.2813E-02', 'domain': 'ARC_LENGTH', 'fieldOutputs': 'Repository object', 'frameId': 10, 'frameValue': 0.0728124976158142, 'frequency': None, 'incrementNumber': 10, 'isImaginary': False, 'loadCase': None, 'mode': None},)
>>> type(td)
<type 'tuple'>
>>> new_td = td[0]
>>> type(new_td)
<type 'dict'>
>>> new_td.get('frameId')
10

使用することによりdict.get()(ポップ、インデックス作成、または反復と検索のためにジェネレーターを実行するのとは対照的に - これは単純に無駄で非効率的です)、Python のビルトインの一部を設計どおりに使用することができます。

keyさらに、がディクショナリに存在しない場合は が返されるため、戻り値をより詳細に制御できますNone。ほとんどのプログラマーはより堅牢であることを好むため、これがあらゆる種類のエラー キャッチの始まりです。

便利なことに、期待どおりに返されない場合に備えて、デフォルト値を設定することもできます。例えば:

new_td.get('frameSurpriseID', "Sorry, it doesn't exist!")

frameSurpriseID はkeyディクショナリnew_tdにないため、関連付けられていないため、通常は(False)valueが返されます。Noneただし、2 番目の位置 (この場合は既定の戻り値) を渡したので、代わりに が返されSorry, it doesn't existます。

警告

他の回答では、辞書から値を抽出する方法としてインデックス作成が提案されています。key:value辞書に常に同じペアがあることがわかっている場合は、これで問題ありません。ただし、次の状況での動作を観察してください。

>>> new_td['myKey']

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    new_td['myKey']
KeyError: 'myKey'

これが、私が Python 辞書メソッド.get()(より制御し、より堅牢な IMHO) を使用することをお勧めする理由です。

于 2013-05-09T15:44:41.260 に答える