web-dev-qa-db-ja.com

Python 3で `OrderedDict`の最初のアイテムを取得する最短の方法

Python 3でOrderedDictの最初の項目を取得する最短の方法は何ですか?

私のベスト:

list(ordered_dict.items())[0]

かなり長くてい。

私は考えることができます:

next(iter(ordered_dict.items()))       # Fixed, thanks Ashwini

しかし、それはあまり自己記述的ではありません。

より良い提案はありますか?

34
Ram Rachum

読みやすさのためのプログラミングの実践

一般に、コードが自己記述的ではないと感じる場合、通常の解決策は、コードを適切な名前の関数に分解することです:

_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)
_

コレクションから単一の値を抽出するためのパターン

setdictOrderedDictから要素を取得する通常の方法、ジェネレータ、またはその他のインデックス不可能なコレクションは次のとおりです。

_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)
_
35

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.

10
ralien

サブクラス化して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()))
2
Bryce Guinta

最初のレコード

[key for key, value in ordered_dict][0]

最後のレコード

[key for key, value in ordered_dict][-1]
0
galaga4

推奨される解決策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
0
jpp

読み取り可能なコードで、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
0
YitzikC