web-dev-qa-db-ja.com

python辞書でn番目のキーを抽出しますか?

python辞書と整数nが与えられた場合、nthキーにアクセスする必要があります。プロジェクトでこれを何度も繰り返す必要があります。

私はこれを行う関数を書きました:

def ix(self,dict,n):
    count=0
    for i in sorted(dict.keys()):
        if n==count:
            return i
        else:
            count+=1

しかし、問題は、辞書が巨大な場合、繰り返し使用すると時間の複雑さが増すことです。

これを行う効率的な方法はありますか?

16
Hemanth Malla

このようなことをしたいと思いますが、辞書には順序がないため、dic.keysのキーの順序は何でもかまいません。

def ix(self, dic, n): #don't use dict as  a variable name
   try:
       return list(dic)[n] # or sorted(dic)[n] if you want the keys to be sorted
   except IndexError:
       print 'not enough keys'
11

dict.keys()はリストを返すので、必要なのはdict.keys()[n]だけです。

しかし、ディクショナリは順序付けられていないコレクションであるため、このコンテキストではn番目の要素は意味がありません。

10
shyam

dict.keys()は、配列インデックスを使用して要素にアクセスできることを意味するリストを返します。

def ix(self, dict, n):
    if len(dict.keys()) > n:
        return dict.keys()[n]
    else:
        //NOT ENOUGH ELEMENTS
1
vincentkriek

辞書は順不同のコレクションです。したがって、1番目、2番目、n番目の要素はありません。

0
sinhayash

N番目の要素にアクセスするためだけに新しい一時リストを作成したくない場合は、イテレーターを使用することをお勧めします。

from itertools import islice
def nth_key(dct, n):
    it = iter(dct)
    # Consume n elements.
    next(islice(it, n, n), None) 
    # Return the value at the current position.
    # This raises StopIteration if n is beyond the limits.
    # Use next(it, None) to suppress that exception.
    return next(it)

これは、キーを一時リストに最初に変換してからそのn番目の要素にアクセスするよりも、非常に大きな辞書の場合に特に高速です。

0
normanius

どんな順序が欲しいかという質問がありますか?コード例から、キーのアルファベット順が必要です。

興味深いことに、これは新しい振る舞いであるため、私はこれについて言及しています。dictsは、Python 3.7 stackoverflow question のc実装で挿入順序を保持します

したがって、挿入の順序が必要な場合は、次のようにする必要があります:

d.values()

辞書が本質的に無秩序であると言う人々は、より広いITでも正しいです。理論的な意味、およびPythonバージョン3.5以前の実用的な意味でも。

0