python辞書と整数n
が与えられた場合、n
thキーにアクセスする必要があります。プロジェクトでこれを何度も繰り返す必要があります。
私はこれを行う関数を書きました:
def ix(self,dict,n):
count=0
for i in sorted(dict.keys()):
if n==count:
return i
else:
count+=1
しかし、問題は、辞書が巨大な場合、繰り返し使用すると時間の複雑さが増すことです。
これを行う効率的な方法はありますか?
このようなことをしたいと思いますが、辞書には順序がないため、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'
dict.keys()
はリストを返すので、必要なのはdict.keys()[n]
だけです。
しかし、ディクショナリは順序付けられていないコレクションであるため、このコンテキストではn番目の要素は意味がありません。
dict.keys()
は、配列インデックスを使用して要素にアクセスできることを意味するリストを返します。
def ix(self, dict, n):
if len(dict.keys()) > n:
return dict.keys()[n]
else:
//NOT ENOUGH ELEMENTS
辞書は順不同のコレクションです。したがって、1番目、2番目、n番目の要素はありません。
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番目の要素にアクセスするよりも、非常に大きな辞書の場合に特に高速です。
どんな順序が欲しいかという質問がありますか?コード例から、キーのアルファベット順が必要です。
興味深いことに、これは新しい振る舞いであるため、私はこれについて言及しています。dictsは、Python 3.7 stackoverflow question のc実装で挿入順序を保持します
したがって、挿入の順序が必要な場合は、次のようにする必要があります:
d.values()
辞書が本質的に無秩序であると言う人々は、より広いITでも正しいです。理論的な意味、およびPythonバージョン3.5以前の実用的な意味でも。