辞書で最初のキーをどのように見つけますか?


200

プログラムを"banana"辞書から印刷しようとしています。これを行う最も簡単な方法は何でしょうか?

これは私の辞書です:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
Pythonの辞書は順序付けされていないため、「最初のキー」はありません。こちらをご覧ください
デビッドロビンソン

2
文字列「バナナ」または「バナナ」に関連付けられた値(この場合は4)を印刷しますか?
ポールH

to print out banana with a FOR loop, so when I run it, each key would also be printed outもしかしてfor k in prices: print k?これにより、辞書内のすべてのキーが出力されます。
デビッドロビンソン


7
最初のコメントへ:Python 3.6以降では、辞書が注文されます(stackoverflow.com/questions/39980323/…を参照)
Egirus Ornila

回答:


284

辞書が実際に注文されているPythonバージョンでは、次のことができます

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

dictsを注文するには、Python 3.7以降が必要です。Python3.6でのdictsの技術的、実装、詳細の順序付けの性質に依存しても問題ない場合は、3.6以降が必要です。

以前のバージョンのPythonでは、「最初のキー」はありません。


29
Python 3でキーと値の両方が必要な場合:next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Python dictsは、CPython 3.6以降の挿入、およびPython 3.7以降のその他のPython実装によって順序付けられています
Boris

1
この回答は、ブレークポイントに到達するまで6時間待っていたデバッグセッションを台無しにしました。これは非常に重要です。
Michael

128

辞書は索引付けされていませんが、何らかの方法で順序付けされています。以下は、最初の既存のキーを提供します。

list(my_dict.keys())[0]

24
list(my_dict)[0]それはとにかくキーのリストを取得するので、単に置くのは簡単ではないでしょうか?
Jean-Francois T.

@ Jean-FrancoisT。はい
Ryan Haining

辞書はCPython 3.6およびPython 3.7以降のその他のすべてのPython実装で注文されるようになりました
Boris

52

更新: Python 3.7以降、挿入順序は維持されるため、OrderedDictここは必要ありません。通常の方法で以下のアプローチを使用できますdict

バージョン3.7で変更:辞書順は挿入順であることが保証されています。この動作は、3.6からのCPythonの実装の詳細でした。

ソース


Python 3.6およびそれ以前*

通常のについて話している場合dict、「最初のキー」は何も意味しません。キーは、信頼できる順序で並べられていません。あなたがあなたの上で反復するならば、あなたはdictあなたが"banana"最初に見るものとしておそらく得られないでしょう。

物事を整理する必要がある場合OrderedDictは、単なる辞書ではなくを使用する必要があります。

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

その後、すべてのキーを順番に表示したい場合は、それを反復することで確認できます

for k in prices:
    print(k)

または、すべてのキーをリストに入れてから、それを操作することもできます

ks = list(prices)
print(ks[0]) # will print "banana"

リストを作成せずに最初の要素を取得するより速い方法nextは、イテレータを呼び出すことです。nth要素を取得しようとすると、これはうまく一般化されません

>>> next(iter(prices))
'banana'

* CPythonは、3.6の実装の詳細として挿入順序を保証していました。


アドバイスありがとうございます。わかりづらくてすみません。関連付けられている値ではなく、「バナナ」を出力できるコードを見つけようとしています。すべての入力をありがとう!
スラゴイ2015年

31

以下のPython 3の場合、リスト変換のオーバーヘッドがなくなります。

first = next(iter(prices.values()))

10

dictタイプは、順序付けられていないので、「最初の」要素のようなものは存在しない、マッピング。

あなたが望むのはおそらくcollections.OrderedDictです。


または名前付きタプル(おそらくそれが不変の場合)
Beasley

これはPython 3.6で変更されました。辞書が注文されました。
misantroop

1
厳密に言えば、確かな場合、辞書キーの最初の要素が必要です。キーは1つだけです。
DBX12

ifが修正されたdictを反復しながら、最初の項目を言うことができます。しかし、それを理解するための幸運。
デーモンゴーレム

6

そのため、既知の長さ1のディクショナリで唯一のキーを取得してキーのみを返すように最適化しようとしたときに、このページを見つけました。以下のプロセスは、サイズ700まで試したすべての辞書の中で最速でした。

私は7つの異なるアプローチを試したところ、Python 3.6を搭載した2014 Macbookでこれが最良であることがわかりました。

def first_5():
    for key in biased_dict:
        return key

それらをプロファイリングした結果は次のとおりです。

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

私が試したすべてのアプローチはここにあります:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
したがって、forループを実行して最初のキー(first_5)を返すのは、私が見ることができるように実際には最速ですか?また、さまざまなアプローチの優れた比較。
PiMathCLanguage

1
うん、そして最速だけでなく、カントリーマイルで最速。また、最も読みやすく、便利です。
turiyag

4

簡単なことですが、私による答えは

first = list(prices)[0]

辞書をリストに変換するとキーが出力され、リストから最初のキーが選択されます。


python3の場合、最初の要素のみを取得するためにまったく新しいリストを作成する必要はありません。next(iter(prices))他の回答ですでに示唆されているように、をよりよく使用します。
ノルマニウス

1

他の多くの人が指摘したように、辞書には最初の値はありません。それらのソートは任意であり、辞書にアクセスするたびにソートが同じであるとは限りません。ただし、キーを印刷する場合は、いくつかの方法があります。

for key, value in prices.items():
    print(key)

このメソッドは、タプル割り当てを使用してキーと値にアクセスします。これは、何らかの理由でキーと値の両方にアクセスする必要がある場合に便利です。

for key in prices.keys():
    print(key)

これは、keys()メソッドが意味するように、キーへのアクセスのみを提供します。


1

個別のキーを取得するには、d.keys()[0]。

更新:-@AlejoBernardin、それが機能しなかったと言った理由がわかりません。ここで確認しましたが、うまくいきました。コレクションをインポートする

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'バナナ'


投票数で見ると、なぜこれが最善の解決策ではないのですか?
GuSuku

18
これはpython2では機能しますが、python3では機能しません。python3では、インデックスの作成をサポートしていないの代わりにをdict.keys()返します。'dict_keys' objectlist
mavix 2018年

TypeError: 'dict_keys'オブジェクトはインデックス作成をサポートしていません
anilbey

0

のすべてのキーを範囲とするforループを使用しますprices

for key, value in prices.items():
     print key
     print "price: %s" %value

Python 2.xを使用prices.items()しているprices.iteritems()場合は、に必ず変更してください


0

辞書の最初のキーだけが必要な場合は、多くの人が以前に提案したものを使用する必要があります

first = next(iter(prices))

ただし、最初のものが必要で残りをリストとして保持する場合は、値展開演算子を使用できます

first, *rest = prices

キーと値の両方に置き換えpricesprices.values()、値に同じことが適用できます。アンパック割り当てを使用することもできます。

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

注:first, *_ = prices最初のキーを取得するのに使いたくなるかもしれませんが、ディクショナリがすべてのキーをループしてリストを作成するために多少のオーバーヘッドがあるため、ディクショナリが非常に短い場合を除き、通常はこの使用法を推奨しませんrest

注:他の人が述べたように、挿入順序はpython 3.7(または技術的には3.6)以降で維持されますが、以前の実装は未定義の順序と見なされます。


-3

最も簡単な方法は次のとおりです。

first_key = my_dict.keys()[0]

ただし、場合によっては、より注意深く、エンティティが貴重なリストであることを確認する必要があります。

first_key = list(my_dict.keys())[0]

3
これは上げるTypeError: 'dict_keys' object is not subscriptableのPython 3.8を有する少なくとも、
EerikスヴェンPuudist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.