Python 3でOrderedDict
の最初の項目を取得する最短の方法は何ですか?
私のベスト:
list(ordered_dict.items())[0]
かなり長くてい。
私は考えることができます:
next(iter(ordered_dict.items())) # Fixed, thanks Ashwini
しかし、それはあまり自己記述的ではありません。
より良い提案はありますか?
一般に、コードが自己記述的ではないと感じる場合、通常の解決策は、コードを適切な名前の関数に分解することです:
_def first(s):
'''Return the first element from an ordered collection
or an arbitrary element from an unordered collection.
Raise StopIteration if the collection is empty.
'''
return next(iter(s))
_
ヘルパー関数 を使用すると、後続のコードは非常に読みやすくなります。
_>>> extension = {'xml', 'html', 'css', 'php', 'xhmtl'}
>>> one_extension = first(extension)
_
set、dict、OrderedDictから要素を取得する通常の方法、ジェネレータ、またはその他のインデックス不可能なコレクションは次のとおりです。
_for value in some_collection:
break
_
そして:
_value = next(iter(some_collection))
_
next()関数を使用すると、コレクションが空の場合にデフォルト値を指定できるか、例外を発生させることができるため、後者は素晴らしいです。 next()関数も、次の項目を要求していることを明示しています。
実際にインデックス付けとスライス、およびその他のシーケンス動作(複数の要素のインデックス付けなど)が必要な場合、list(some_collection)
を使用してリストに変換するか、[itertools.islice()][2]
を使用するのは簡単です。
_s = list(some_collection)
print(s[0], s[1])
s = list(islice(n, some_collection))
print(s)
_
popitem(last=False)
を使用しますが、辞書からエントリを削除する、つまり破壊的であることに注意してください。
from collections import OrderedDict
o = OrderedDict()
o['first'] = 123
o['second'] = 234
o['third'] = 345
first_item = o.popitem(last=False)
>>> ('first', 123)
詳細については、 collections のマニュアルをご覧ください。また、Python 2.x.
サブクラス化してOrderedDict
にメソッドを追加すると、明確性の問題に対する答えになります。
>>> o = ExtOrderedDict(('a',1), ('b', 2))
>>> o.first_item()
('a', 1)
ExtOrderedDict
の実装:
class ExtOrderedDict(OrderedDict):
def first_item(self):
return next(iter(self.items()))
最初のレコード:
[key for key, value in ordered_dict][0]
最後のレコード:
[key for key, value in ordered_dict][-1]
推奨される解決策next(iter(s))
は、反復可能オブジェクトのfirst値を抽出する特定のケースで機能します。イテラブルの長さがわかっている場合、一般化してn thの値を抽出できます。
def get_nth_item(it, n=0):
if n < 0:
n += len(it)
for index, item in enumerate(it):
if index == n:
return item
raise IndexError(f'Iterable index {n} out of range')
これは、意図を明確にする明確な方法であり、負のインデックスをサポートしていますおよび誤ったインデックスが提供された場合にエラーを処理します。 OrderedDict
の使用例:
from collections import OrderedDict
od = OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])
get_nth_item(od.items(), n=0) # (1, 'a')
get_nth_item(od.items(), n=-1) # (3, 'c')
get_nth_item(od.items(), n=3) # IndexError: Iterable index 3 out of range
読み取り可能なコードで、OrderedDictを変更せずに残し、最初のアイテムを取得するだけのために潜在的に大きなリストを生成する必要はありません。
for item in ordered_dict.items():
return item
Ordered_dictが空の場合、Noneが暗黙的に返されます。
一連のコード内で使用する代替バージョン:
for first in ordered_dict.items():
break # Leave the name 'first' bound to the first item
else:
raise IndexError("Empty ordered dict")
上記の最初の例に対応するPython 2.xコードは、代わりにiteritems()を使用する必要があります。
for item in ordered_dict.iteritems():
return item