インデックスによるPython辞書の要素へのアクセス


117

のような口述を考えてください

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

たとえば、この辞書の特定の要素にアクセスするにはどうすればよいですか?たとえば、Appleの最初の要素をフォーマットした後に最初の要素を印刷したいのですが、この場合は「アメリカ」のみですか?

追加情報上記のデータ構造は、Python関数で入力ファイルを解析することによって作成されました。ただし、一度作成すると、その実行については同じままです。

このデータ構造を関数で使用しています。

したがって、ファイルが変更された場合、次にこのアプリケーションを実行したときのファイルの内容は異なるため、このデータ構造の内容は異なりますが、形式は同じです。ですから、私の関数では、Appleの最初の要素が 'American'などであることを知らないので、 'American'をキーとして直接使用することはできません。


2
期待する出力の例を挙げていただけますか?
ビョルンPollex

3
この構造で実際に何をしたいですか?そして、あなたはdictのキーを知っていますか(あなたの例では「Apple」と「Grapes」)?または、あなたはあなたが口述の口述を得るであろうことだけを知っていますか?
juanchopanza

6
辞書を呼び出さないでくださいdict。「dict」という単語はすでにPythonのキーワードです。など、他のものを使用しますmydict
Rickは

注:この質問は、インデックスによってdict要素にアクセスすることに関するものです。これは、dict が順序付けされていないため意味がありません。ネストされた辞書の要素へのアクセスに関する質問については、Python- 辞書内にネストされた値へのアクセスを参照してください。
2018

@ Aran-Fey:順序付けられていないものには固有の順序があります。順序付けなし!=順序付けなし。
ジェイミーマーシャル

回答:


122

それが辞書であることを考えると、キーを使用してアクセスします。「アップル」の下に格納されている辞書を取得するには、次の操作を行います。

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

そして、そのうちのいくつがアメリカ人であるか(16)を取得するには、次のようにします。

>>> mydict["Apple"]["American"]
'16'

9
要素の深さを知らずに、これをどのように動的に行うことができますか?
Ethan Bierlein、2015年

3
正確に何を知りたいですか?辞書のキーを取得できるので、.keys()動的にアクセスできます。
Morten Kristensen、2015年

3
たとえば、ネストされた辞書など、深さが不明な辞書があり、"n"深さが不明な要素があり、不明な要素に格納されている場合などです。
Ethan Bierlein

1
それは非常に広い質問です。データ構造を考慮して、適切に処理する関数またはクラスを記述します。おそらく、キーとそのキーを見つけるための戦略を提供できます。
Morten Kristensen、2015年

1
@EthanBierleinの使用: 'for key、value in dictionary.iteritems()' to access access to key and value
danius

25

質問がある場合、私が果物として「アップル」を含み、リンゴの一種として「アメリカ人」を含む口述の口述書を持っていることがわかっている場合、私は以下を使用します。

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }


print myDict['Apple']['American']

他の人が示唆したように。代わりに質問がある場合は、任意のファイルをdict of dictデータ構造に読み込んだときに、果物としての「Apple」と「Apple」のタイプとしての「American」が存在するかどうかわからない場合は、次のようにすることができます。

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

AppleだけがAmerican型であることがわかっている場合は、dictの口述全体を不必要に反復しないようにしてください。

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

これらのすべてのケースで、辞書が実際にエントリを格納する順序は重要ではありません。注文が本当に心配な場合は、次のように使用することを検討してOrderedDictください。

http://docs.python.org/dev/library/collections.html#collections.OrderedDict


20

私があなたの説明に気付いたように、あなたはあなたのパーサーがあなたにその値が次のように辞書であることをあなたに辞書を与えることを知っています:

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

したがって、親辞書を反復処理する必要があります。sampleDict.values()リストの最初のすべての辞書キーを印刷またはアクセスする場合は、次のようなものを使用できます。

for key, value in sampleDict.items():
    print value.keys()[0]

の最初のアイテムの最初のキーにアクセスするだけの場合sampleDict.values()、これは便利です。

print sampleDict.values()[0].keys()[0]

あなたが質問で与えた例を使用する場合、私は意味します:

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

最初のコードの出力は次のとおりです。

American
Indian

そして、2番目のコードの出力は次のとおりです。

American

10

おまけとして、私はあなたの問題に対して一種の異なる解決策を提供したいと思います。ネストされた辞書を扱っているようですが、これは通常、特に内部キーの存在を確認する必要がある場合に退屈です。

これに関するいくつかの興味深いライブラリがpypiにあります。ここに簡単な検索があります。

あなたの特定のケースでは、dict_diggerが適しているようです。

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

8

を使用dict['Apple'].keys()[0]してAppleディクショナリの最初のキーを取得できますが、それがであるという保証はありませんAmerican。ディクショナリ内のキーの順序は、ディクショナリの内容とキーが追加された順序によって異なる場合があります。


ライブラリで使用OrderedDictしない限りcollections
Escachator

7

私はこれが8歳であることを知っていますが、実際に質問を読んで答えた人はいません。

dictで.values()を呼び出して、内部dictのリストを取得し、インデックスによってそれらにアクセスできます。

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']

2
面白い、私はこれを試してみました'dict_values' object does not support indexing 。リストを復元するにはdict_valuesをラップする必要があるので、この回答は更新が必要だと思います
Yuca

1
@ユッカ-あなたは正しかった、私は私のコードをテストしなかった。答えが更新されました
ジェイミーマーシャル

4

辞書の順序に依存することはできません。しかし、これを試すことができます:

dict['Apple'].items()[0][0]

順序を維持したい場合は、これを使用することができます:http : //www.python.org/dev/peps/pep-0372/#ordered-dict-api



0

この質問に対する多くの回答にもかかわらず、辞書は順序付けられていないマッピングであることを指摘している人はほとんどいないため、(Python 3.7で挿入順序が祝福されるまで)文字どおりに作成された辞書の「最初の」エントリのアイデアも意味ない。またOrderedDictmydict[mydict.keys()[0]](Python 3ではkeys()添え字なしのイテレータであるため、Python 2のみのような醜さを使用して数値インデックスでのみアクセスできます。)

3.7以降および実際には3,6でも-新しい動作が導入されましたが、3.7まで言語仕様の一部として含まれていませんでした-dictのキー、値、または項目の反復(そして、私は、 set)も、最初に最も最近に挿入されたオブジェクトを生成します。挿入の数値インデックスによってそれらにアクセスする簡単な方法はまだありません。

アイテムの選択と「フォーマット」の問題に関して、辞書で取得するキーがわかっている場合は、通常、そのキーを添え字として使用してキーを取得します(my_var = mydict['Apple'])。

エントリ番号で項目にインデックスを付けることが本当に必要な場合(挿入が行われると特定のエントリの番号が変わるという事実を無視して)、適切な構造はおそらく2要素のタプルのリストになります。の代わりに

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

あなたが使うかもしれません:

mylist = [
    ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
    ('Grapes', {'Arabian': '25', 'Indian': '20'}
]

この体制では、最初のエントリはmylist[0]古典的なリストで終了した形式であり、その値は('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})です。次のようにリスト全体を反復できます。

for (key, value) in mylist:  # unpacks to avoid tuple indexing
    if key == 'Apple':
        if 'American' in value:
            print(value['American'])

しかし、「Apple」というキーを探していることがわかっている場合は、代わりにdictを使用しないのはなぜですか。

キーのリストをキャッシュすることで、間接参照のレベルを追加することもできますが、2つのデータ構造を同期させておくことの複雑さは、必然的にコードの複雑さを増します。


0

次の小さな関数を使用すると、ツリー型の辞書を掘り下げることが非常に簡単になります。

def dig(tree, path):
    for key in path.split("."):
        if isinstance(tree, dict) and tree.get(key):
            tree = tree[key]
        else:
            return None
    return tree

ここで、をdig(mydict, "Apple.Mexican")返し10dig(mydict, "Grape")サブツリーを生成し{'Arabian':'25','Indian':'20'}ます。キーが辞書に含まれていない場合は、をdig返しますNone

セパレーター文字を「。」から簡単に変更(またはパラメーター化)できることに注意してください。「/」、「|」等

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.