web-dev-qa-db-ja.com

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

以下に辞書があります:

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

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

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

68
Harpal

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

Python 2.7から始まるエントリの順序を気にする場合は、 collections.OrderedDict を使用できます。または、ペアのリストを使用します

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

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

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

86
Sven Marnach

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

Python 3.7 *辞書はorder-preservingです。つまり、collections.OrderedDictsとまったく同じように動作します慣れている。残念ながら、辞書の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- thキーが必要な場合、同様に

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にはすでに順序付けされた辞書が含まれていますが、これは実装の詳細に過ぎません。言語仕様には、3.7以降の順序付けられた辞書が含まれています。)

61
Pasha

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

Pythonの規則としてDICTIONARYはorderless

もしあれば

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"}

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

したがって、経験則は_辞書_​​orderless!です!

3
Raj Damani

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

ちょうど見る:

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}

ハッシュマップの力により、一定時間内にエントリのインデックスを取得できるようになりました(別名、はるかに高速)

2
user3368835

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

1
Utku Zihnioglu
import collections 

# Declaring namedtuple() 
dimensions = collections.namedtuple('colors',['blue','red','yellow']) 
S = dimensions('5','6','8')
# Access using index 
print ("The dimension of red using index is : ",end ="") 
print (S[1]) 
# Access using name  
print ("The dimension of red using keyname is : ",end ="") 
print (S.red) 
# Access using getattr() 
print ("The dimension of red  using getattr() is : ",end ="") 
print (getattr(S,'red')) 
1
user1464878

ああ、それは難しいものです。ここにあるのは、基本的に、各アイテムに2つの値があります。次に、数字をキーとして呼び出します。残念ながら、値の1つがすでにキーとして設定されています!

これを試して:

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

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

例えば、

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

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

もちろん、各色がどの位置にあるかを追跡する別の方法を考え出す必要があります。各色のキーを値として保存する別の辞書を作成することもできます。

colors_key = {'blue':1、 'red':6、 'yllow':8}

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

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

そんな感じ。

そして、あなたがそれをしている間に、あなたはあなたがいつでもあなたの色を調べるためにそれらを必要に応じて使用できるように、キーとして数値として辞書を作ることができます。

値= {5:[1、 'blue']、6:[2、 'red']、8:[3、 'yellow']}

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

または、リストのリストを使用できます。

幸運を!

1
Godfreyluck

辞書はリストではありません。

リストを使用すると、enter foo[0] hereを実行してその値を取得できます。

dictsは.valueおよび.keys()関数を取得しました。

また、dictを反復処理するときは常にtry/exceptを使用することをお勧めします。

0
RichieKing

dictは順序付けられていないため、できません。 .popitem()を使用して任意のアイテムを取得できますが、それにより辞書から削除されます。

辞書のデータ構造は順序付けられていないため、辞書の最初のエントリにインデックスを付けることはできませんが、辞書内の値にはインデックスを付けることができます。

new_dict= {'first': 'Meghshyam', 'second': 'Sonar', 'third': '1993'}

#aboveは、3つの値を含む辞書です。

#次のコードは、キーを使用して辞書の最初の値にインデックスを書き込みます

new_dict['first'][0]

#対応するキーを使用して値の最初の文字にインデックスを付けるだけです。

これがコンセプトを明確にすることを願っています。

0
Meghshyam Sonar