1. ホーム
  2. for-loop

[解決済み] 'for'ループの最後の要素を検出するpythonic方法は何ですか?

2022-04-01 17:05:52

質問

forループの最後の要素に対して特別な処理を行うための最良の方法(よりコンパクトで"pythonic"な方法)を知りたいのですが、どうすればよいでしょうか?以下のコードだけが呼び出されます。 の間に 要素では抑制されます。

現在、私が行っている方法は以下の通りです。

for i, data in enumerate(data_list):
    code_that_is_done_for_every_element
    if i != len(data_list) - 1:
        code_that_is_done_between_elements

何か良い方法はないでしょうか?

注)このようなハッキングで作るのではなく reduce . ;)

解決方法は?

を作る方が簡単(安上がり)な場合がほとんどです。 最初 の繰り返しを特別なケースとして扱います。

first = True
for data in data_list:
    if first:
        first = False
    else:
        between_items()

    item()

これはどのような反復記号に対しても有効であり、たとえそれが len() :

file = open('/path/to/file')
for line in file:
    process_line(line)

    # No way of telling if this is the last line!

それはさておき、何をしようとしているかによるので、一概に優れた解決策はないと思います。例えば、リストから文字列を生成するのであれば、当然ながら str.join() を使うよりも for ループを「特殊なケースで」使用します。


同じ原理で、よりコンパクトに。

for i, line in enumerate(data_list):
    if i > 0:
        between_items()
    item()

見覚えありますよね :)


を使わない反復処理可能なオブジェクトの現在の値を調べる必要がある、@ofko やその他の人のために。 len() が最後の1つである場合、先を見る必要があります。

def lookahead(iterable):
    """Pass through all values from the given iterable, augmented by the
    information if there are more values to come after the current one
    (True), or if it is the last value (False).
    """
    # Get an iterator and pull the first value.
    it = iter(iterable)
    last = next(it)
    # Run the iterator to exhaustion (starting from the second value).
    for val in it:
        # Report the *previous* value (more to come).
        yield last, True
        last = val
    # Report the last value.
    yield last, False

すると、こんな風に使うことができます。

>>> for i, has_more in lookahead(range(3)):
...     print(i, has_more)
0 True
1 True
2 False