Pythonで辞書の任意の要素にアクセスする


507

a mydictが空でない場合、次のように任意の要素にアクセスします。

mydict[mydict.keys()[0]]

これを行うより良い方法はありますか?


3
彼が言ったこと..これは、dictに要素が1つしかない場合、またはどちらを取得してもかまわない場合にのみ有効な質問です。
ロイヤル、

5
うん、私は辞書のどの要素にもアクセスする必要があるだけなので、それが最初の要素にアクセスしたい理由です。
Stan

2
@スタン:しかし、グレッグが言ったように、dictには明確な「最初の」要素はありません。ですから、明確にするために質問を変更する必要があるかもしれません
tdihp

10
妥当な質問だと思います。任意の要素にアクセスする必要があり、dictが空でないことが確実な場合は、項目の数がわからない可能性があるため、「最初」を要求することをお勧めします。
2015

7
@MichaelScheperリストにキャストする必要がありますlist(mydict.keys())[0]
ダニエルモスコ

回答:


600

Python 3では、非破壊的かつ反復的に:

next(iter(mydict.values()))

Python 2では、非破壊的かつ反復的に:

mydict.itervalues().next()

Python 2と3の両方で機能させる場合は、sixパッケージを使用できます。

six.next(six.itervalues(mydict))

しかし、現時点ではそれはかなり不可解であり、むしろあなたのコードを好むでしょう。

アイテムを削除する場合は、次の操作を行います。

key, value = mydict.popitem()

「first」はdictPython <3.6では順序付けられた型ではないため、ここでは適切な用語ではない可能性があることに注意してください。Python 3.6+ dictsが注文されました。


35
どういう意味dict.iterkeys().next()ですか?
John Machin

12
@John Machin:さて、質問は最初のキーに関連付けられた値にアクセスするようですので、それも私が答えで行うことです。
2010年

5
これは良く見えます:dict.values().__iter__().__next__():)
Vitaly Zdanevich

17
dict.keys()が直接反復できないのは不愉快です。
セミオマント2017

3
非破壊popitemのために、あなたは(浅い)コピーを行うことができますkey, value = dict(d).popitem()
ペレ

140

1つの要素だけにアクセスする必要がある場合(dictは順序付けを保証しないため、偶然に最初の要素になります)、Python 2でこれを行うだけです。

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

(私の知る限りでは)Pythonは、これらのメソッドの2つの連続した呼び出しが同じ順序でリストを返すことを保証しないことに注意してください。これはPython3ではサポートされていません。

Pythonの3

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element

90
これはPython 2.xでのみ機能しますlist(my_dict.keys())[0]
。3.x

6
それで、これはどんな複雑なクラスですか?確かに、list(my_dict.keys())[0]怠惰ではありませんか?
Evgeni Sergeev

1
明確にするために、そのコメントでの@alldayremixの意味はpython 3.xのmy_dict.function()の結果はインデックス作成をサポートしていないため、これをまずリストに変換してからインデックスを使用する必要があるのはこのためです[0]
Noki

57

python3では、方法:

dict.keys() 

typeの値を返します:dict_keys()、次の方法でdictのキーの最初のメンバーを取得するとエラーが発生します。

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

最後に、dict.keys()をリスト@ 1stに変換し、リストスプライスメソッドで最初のメンバーを取得します。

list(dict.keys())[0]

これは最も簡単なソリューションで、python2とpython3の両方で機能します。
mattmilten 2015年

私のお金のために。私はこの答えが最も直感的であると言います
Thomas Valadez '22

ええ、しかし、これはOPの質問には答えません。つまり、キーではなく、VALUESに到達する方法です。
マイクウィリアムソン

1
@MikeWilliamsonうまくいけば、ほとんどの読者は、キーを指定して、対応する値をpython辞書から取得する方法を知っているでしょう。
eric

5
任意のキーではなく任意のアイテムを取得するには、同様に行うことができますlist(dict.values())[0]
jhin

24

キーを取得する

next(iter(mydict))

値を取得する

next(iter(mydict.values()))

両方を手に入れる

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

最初の2つはPython 2と3です。最後の2つはPython 3ではレイジーですが、Python 2ではレイジーではありません。


16

他の人が述べたように、辞書には順序が保証されていないため、「最初の項目」はありません(ハッシュテーブルとして実装されています)。たとえば、最小のキーに対応する値thedict[min(thedict)]が必要な場合は、それを行います。キーが挿入された順序を気にする場合、つまり「最初に」とは「最も早く挿入された」ことを意味し、Python 3.1ではcollections.OrderedDictを使用できます。これは次のPython 2.7にも含まれます。古いバージョンのPythonの場合、ここで見つけることができる順序付けされたdictバックポート(2.4以降)をダウンロード、インストール、および使用します

Pythonの3.7は の挿入はdicts注文しています。


11

これはどう。ここではまだ触れていません。

py 2&3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

5
dict.values()ビューを返すので、O(1)である必要があります。list(a)新しいリストを返すので、O(n)になります。
ボイシー2018年

また、a = {"a":{"1"}}の場合、python2では機能しないようです
qasimzee

11

辞書の順序付けに関する問題を無視すると、これはより良いかもしれません:

next(dict.itervalues())

このようにして、アイテムの検索と、使用しないキーのリストの生成を回避します。

Python3

next(iter(dict.values()))

2
values()はすべての値のコピーを作成するため(キーのkeys()と同様)、これにより多くの操作がO(n ^ 2)になります。
Glenn Maynard

では、OPバージョンはどうなりますか?その後、イテレータを使用するようにこれを変更します。
マットジョイナー

4
これはPython 2のみです。Python3の場合next(iter(dict.values()))、リストを作成せずに同じ結果を得る必要があります。
2015


2

あなたはいつでもできます:

for k in sorted(d.keys()):
    print d[k]

これにより、ソートに意味がある場合に処理できるキーのセットが一貫してソートされます(組み込みの .hash()に関して)。つまり、たとえば、辞書を展開しても、数値型は一貫してソートされます。

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

辞書は印刷時にソートされることに注意してください。しかし、キーセットは本質的にハッシュマップです!


2

Python 2と3の両方:

import six

six.next(six.itervalues(d))

これは質問に対する答えを提供しません。批評したり、著者に説明を求める場合は、投稿の下にコメントを残してください。
Martin Tournoij、2015年

これは正確に質問Is there any better way to do this?に答えます。
oblalex 2015年

この回答はすでに2回提供されており、そのうちの1つはこのサイトに5年近く掲載されています。これは別の回答(コメント:Python 2と3の両方で機能するように回答を改善する方法)に対するコメントであり、「新しい」回答ではありません。SOのレビューシステムは、この場合、
あまり

いいえ。このバリアントを5年の回答に追加したのは、この回答を書いてから1時間後の17時間前のことです。このページで「6」という単語に対して「検索」を使用してみてください。これらの2つの回答で一致するのは6つだけです。とにかく、この答えは本当にあなたを邪魔しますか?これは将来的に他の人の役に立つかもしれないと思います。それで、契約は何ですか?
oblalex

それは、私見この答えがそもそもその投稿に対する編集であったはずだからです。編集がなければ、人々はあなたの答えを見るためにいくつかのページを下にスクロールする必要があります。それはあなたの意見とほとんど同じである非常に賛成の回答を編集するよりも便利だと思いますか?
Martin Tournoij、2015年

0
first_key, *rest_keys = mydict

11
このコードスニペットをお寄せいただきありがとうございます。このコードスニペットは、限られた範囲内ですぐに役立つ場合があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。答えを編集して、仮定を含めて説明を追加してください。
スラジュラオ

-1

外部ライブラリはなく、Python 2.7と3.xの両方で動作します。

>>> list(set({"a":1, "b": 2}.values()))[0]
1

不適当なキーの場合は.values()を省略してください

>>> list(set({"a":1, "b": 2}))[0]
'a'

-2

サブクラス化dictは1つの方法ですが、効率的ではありません。ここで整数を指定するとd[list(d)[n]]、が返されます。それ以外の場合は、期待どおりに辞書にアクセスします。

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

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