web-dev-qa-db-ja.com

リストからすべての値をPythonで生成する方法は?

返さないで値を生成したいリストがあるとします。これを行うための最もPythonicな方法は何ですか?

これが私の言いたいことです。遅延のない計算のおかげで、リストを計算しました['a', 'b', 'c', 'd']ですが、プロジェクト全体のコードは遅延計算を使用しているため、リスト全体を返すのではなく、関数から値を生成したいと思います。

私は現在それを次のように書いています:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item

しかし、これは私にはPythonicを感じません。

47
bodacydo

iterを使用してリストイテレータを作成します。

return iter(List)

ただし、すでにリストがある場合は、それを返すだけでよいので、より効率的です。

29
Anurag Uniyal

この質問は特定しないので; Python> = 3. に当てはまる答えを提供します

そのリストを返すだけでよい場合は Anuragの提案 を実行しますが、何らかの理由で問題の関数が本当にジェネレータである必要がある場合は、別のジェネレータに委任できます。結果リストに接尾辞を付けたいが、リストが最初になくなった場合に限ります。

def foo():
    list_ = ['a', 'b', 'c', 'd']
    yield from list_

    if something:
        yield this
        yield that
        yield something_else

pythonのバージョンでは、この構文を使用することはできません。forループと本体に単一のyieldステートメントを使用して、質問のようにコードを使用する必要があります。

あるいは;ジェネレータを通常の関数でラップして chain edの結果を返すことができます。これにはpython 2と3で動作するという利点もあります

from itertools import chain

def foo():
    list_ = ['a', 'b', 'c', 'd']

    def _foo_suffix():
        if something:
            yield this
            yield that
            yield something_else

    return chain(list_, _foo_suffix())

あなたは言うことによってジェネレータを構築することができます

(x for x in List)
2
Johannes Charra