a mydict
が空でない場合、次のように任意の要素にアクセスします。
mydict[mydict.keys()[0]]
これを行うより良い方法はありますか?
list(mydict.keys())[0]
。
a mydict
が空でない場合、次のように任意の要素にアクセスします。
mydict[mydict.keys()[0]]
これを行うより良い方法はありますか?
list(mydict.keys())[0]
。
回答:
Python 3では、非破壊的かつ反復的に:
next(iter(mydict.values()))
Python 2では、非破壊的かつ反復的に:
mydict.itervalues().next()
Python 2と3の両方で機能させる場合は、six
パッケージを使用できます。
six.next(six.itervalues(mydict))
しかし、現時点ではそれはかなり不可解であり、むしろあなたのコードを好むでしょう。
アイテムを削除する場合は、次の操作を行います。
key, value = mydict.popitem()
「first」はdict
Python <3.6では順序付けられた型ではないため、ここでは適切な用語ではない可能性があることに注意してください。Python 3.6+ dicts
が注文されました。
dict.iterkeys().next()
ですか?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
1つの要素だけにアクセスする必要がある場合(dictは順序付けを保証しないため、偶然に最初の要素になります)、Python 2でこれを行うだけです。
my_dict.keys()[0] -> key of "first" element
my_dict.values()[0] -> value of "first" element
my_dict.items()[0] -> (key, value) tuple of "first" element
(私の知る限りでは)Pythonは、これらのメソッドの2つの連続した呼び出しが同じ順序でリストを返すことを保証しないことに注意してください。これはPython3ではサポートされていません。
でPythonの3:
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
list(my_dict.keys())[0]
list(my_dict.keys())[0]
怠惰ではありませんか?
python3では、方法:
dict.keys()
typeの値を返します:dict_keys()、次の方法でdictのキーの最初のメンバーを取得するとエラーが発生します。
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
最後に、dict.keys()をリスト@ 1stに変換し、リストスプライスメソッドで最初のメンバーを取得します。
list(dict.keys())[0]
list(dict.values())[0]
。
他の人が述べたように、辞書には順序が保証されていないため、「最初の項目」はありません(ハッシュテーブルとして実装されています)。たとえば、最小のキーに対応する値thedict[min(thedict)]
が必要な場合は、それを行います。キーが挿入された順序を気にする場合、つまり「最初に」とは「最も早く挿入された」ことを意味し、Python 3.1ではcollections.OrderedDictを使用できます。これは次のPython 2.7にも含まれます。古いバージョンのPythonの場合、ここで見つけることができる順序付けされたdictバックポート(2.4以降)をダウンロード、インストール、および使用します。
Pythonの3.7は 今の挿入はdicts注文しています。
辞書の順序付けに関する問題を無視すると、これはより良いかもしれません:
next(dict.itervalues())
このようにして、アイテムの検索と、使用しないキーのリストの生成を回避します。
next(iter(dict.values()))
next(iter(dict.values()))
、リストを作成せずに同じ結果を得る必要があります。
あなたはいつでもできます:
for k in sorted(d.keys()):
print d[k]
これにより、ソートに意味がある場合に処理できるキーのセットが一貫してソートされます(組み込みの .hash()に関して)。つまり、たとえば、辞書を展開しても、数値型は一貫してソートされます。
例
# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())
# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())
# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())
辞書は印刷時にソートされることに注意してください。しかし、キーセットは本質的にハッシュマップです!
Python 2と3の両方:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
に答えます。
first_key, *rest_keys = mydict
サブクラス化dict
は1つの方法ですが、効率的ではありません。ここで整数を指定するとd[list(d)[n]]
、が返されます。それ以外の場合は、期待どおりに辞書にアクセスします。
class mydict(dict):
def __getitem__(self, value):
if isinstance(value, int):
return self.get(list(self)[value])
else:
return self.get(value)
d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
'e': 'test', 'f': 'dictionary', 'g': 'testing'})
d[0] # 'hello'
d[1] # 'this'
d['c'] # 'is'