辞書にインデックスを付ける方法は?


97

私は以下の辞書を持っています:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

辞書の最初のエントリにインデックスを付けるにはどうすればよいですか?

colors[0]KeyError明らかな理由でを返します。


4
「最初」とはどういう意味ですか?辞書には順序がありません。
S.Lott 2010

2
:辞書は今の挿入は、このチェックはPython 3.7以降発注されるstackoverflow.com/questions/39980323/...
ニキータAlkhovik


1
@ S.Lott彼は彼らが注文されていないことを知っているかどうか尋ねなかっただろうに違いない:)。
user77782 8719

回答:


113

Python 3.6までのPythonバージョンでは、辞書は順序付けられていません。エントリの順序を気にせず、とにかくインデックスでキーまたは値にアクセスしたい場合は、d.keys()[i]andd.values()[i]またはorを使用できます。d.items()[i]。(これらのメソッドは、Python 2.xですべてのキー、値、またはアイテムのリストを作成することに注意してください。したがって、それらが複数回必要な場合は、パフォーマンスを向上させるためにリストを変数に格納してください。)

エントリの順序を気にする場合は、Python2.7以降でを使用できますcollections.OrderedDict。またはペアのリストを使用します

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

キーによるアクセスが必要ない場合。(ところで、なぜあなたの数字の文字列なのですか?)

Python 3.7では、通常の辞書が順序付けられているため、使用する必要はありOrderedDictません(ただし、使用することはできます。基本的に同じタイプです)。Python 3.6のCPython実装にはすでにその変更が含まれていますが、言語仕様の一部ではないため、Python3.6では信頼できません。


2
Python 2では、d.iterkeys().next()代わりにd.keys()[0]を使用して、キーの1つを削除せずに検査します。辞書が巨大な場合、パフォーマンスの面で大きな違いが生じます。値とアイテムについても同じことが言えます。Python 2.7では、dictビューオブジェクトを
simleo 2014

44
Python 3では、これらの呼び出しは実際のリストではなくビューを返すため、list()の呼び出しでラップする必要があります。そうしないと、「TypeError: 'dict_values'オブジェクトはインデックス作成をサポートしていません」と表示されます。このSOの質問を参照してください:stackoverflow.com/questions/17431638/...
stifin

3
補正のちょうどNIT:あなたはできません、少なくともではないのPython 3のインデックス項目()、
ジョン・ストロング

1
この回答はPython3.6以降では古くなっています。以下の@Pashaによる回答を参照してください。
hans 2018

1
@hansこの回答はPython3.7では時代遅れですが、Python 3.6では時代遅れです。辞書の順序を保持する性質は、そのPythonバージョンのCPython実装の実装の詳細であり、言語の公式部分ではないためです。それに応じてこの回答を更新します。
Sven Marnach 2018

114

誰かがまだこの質問を見ている場合、現在受け入れられている回答は古くなっています。

Python 3.7 *以降、辞書は順序を保持します。つまり、辞書はcollections.OrderedDict以前とまったく同じように動作するようになりました。残念ながら、辞書のkeys()/にインデックスを付けるための専用の方法はまだないvalues()ため、辞書の最初のキー/値を取得するには、次のように実行できます。

first_key = list(colors)[0]
first_val = list(colors.values())[0]

または代わりに(これにより、キービューがリストにインスタンス化されるのを回避できます):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

n-番目のキーが必要な場合は、同様に

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

(* CPython 3.6にはすでに順序付きdictが含まれていますが、これは実装の詳細にすぎません。言語仕様には3.7以降の順序付きdictが含まれています。)


対応するドキュメントへのリンクを提供していただけますか?
アミールアフィアニアン

3

辞書の要素に取り組むことは、ロバに座って乗り心地を楽しむようなものです。

PythonのルールとしてDICTIONARYは無秩序です

もしあるなら

dic = {1: "a", 2: "aa", 3: "aaa"}

今、私が好きになったとしたらdic[10] = "b"、それはいつもこのように追加されるわけではありません

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

それはのようかもしれません

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

または

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

または

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

またはそのような組み合わせ。

したがって、経験則はDICTIONARYであり、順序はありません。


これは非常に簡単です...私はそれが好きです!
Alex Liu 332146

2

順序付けられた辞書が必要な場合は、odictを使用できます。


odictは、keys()、values()、またはitems()へのインデックス作成をサポートしていないと見なしています。
コンスタンチン

2

実際、私は本当に助けになる新しい解決策を見つけました。リストまたはデータセット内の特定の値のインデックスに特に関心がある場合は、辞書の値をそのインデックスに設定するだけです!:

ちょうど見る:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

これで、ハッシュマップの機能により、エントリのインデックスを一定の時間でプルできます(別名、はるかに高速になります)


1

ああ、それは難しいものです。ここにあるのは、基本的に、各アイテムに2つの値です。次に、番号をキーとしてそれらに電話をかけようとしています。残念ながら、値の1つがすでにキーとして設定されています。

これを試して:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

これで、リストのようにインデックスが付けられているかのように、キーを番号で呼び出すことができます。リスト内の位置で色と番号を参照することもできます。

例えば、

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

もちろん、各色がどの場所にあるかを追跡する別の方法を考え出す必要があります。おそらく、各色のキーを値として格納する別の辞書を作成することができます。

colors_key = {'青':1、 '赤':6、 '黄色':8}

次に、必要に応じてカラーキーを検索することもできます。

colors [colors_key ['blue']] [0]は 'blue'を返します

そんな感じ。

そして、あなたがそれにいる間、あなたはキーとして数字の値を使って口述をすることができます、それであなたはあなたが必要ならばあなたの色を調べるためにいつでもそれらを使うことができます。

値= {5:[1、 '青']、6:[2、 '赤']、8:[3、 '黄']}

次に、(colors [colors_key [values [5] [1]]] [0])は「青」を返します。

または、リストのリストを使用することもできます。

幸運を!


0

dict注文されていないので、できません。を使用.popitem()して任意のアイテムを取得できますが、それによってdictから削除されます。


next(iter(d.items())).iteritems()Python 2の場合)任意のアイテムも提供しますが(私のテストでも同じです。これを使用してpopitemを実装できるため、意味があります)、アイテムは削除されません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.