16

次のようなものを持つことは可能ですか:

list1 = ...

currentValue = 0
list2 = [currentValue += i, i for i in list1]

やってみたけどダメだった?それらを書くための適切な構文は何ですか?

編集: print ステートメントは一例です。実際、ループの外で値を増やしています。

4

9 に答える 9

32

Python ではステートメントを式の中に入れることはできません。それは言語から意図的に設計された複雑なものでした。この問題については、言語に組み込まれた複雑な機能であるジェネレーターを使用してみてください。時計:

def total_and_item(sequence):
    total = 0
    for i in sequence:
        total += i
        yield (total, i)

list2 = list(total_and_item(list1))

ジェネレーターは、これまでに見たアイテムの実行中の集計を保持し、例が試みているように見えるように、各アイテムにプレフィックスを付けます。もちろん、一番上に空のリストを作成し、append() を何度も呼び出す単純なループはもっと単純かもしれません! :-)

于 2009-04-21T22:45:01.677 に答える
4

あなたが何をしようとしているのかはよくわかりませんが、おそらく次のようなものです

list2 = [(i, i*2, i) for i in list1]
print list2

リスト内包表記のステートメントは単一のステートメントでなければなりませんが、いつでも関数呼び出しにすることができます。

def foo(i):
    print i
    print i * 2
    return i
list2 = [foo(i) for i in list1]
于 2009-04-21T22:18:46.013 に答える
2

別の質問の例を次に示します。

[i for i,x in enumerate(testlist) if x == 1]

enumerate ジェネレーターは、i,x に入る 2 タプルを返します。

于 2009-04-21T22:20:33.637 に答える
1

なぜ重複リストを作成するのでしょうか。リスト内包表記は、内容を合計するだけのようです。

なぜだけではないのですか。

list2 = list(list1)   #this makes a copy
currentValue = sum(list2)
于 2009-04-24T06:02:04.653 に答える
1

編集した例の場合:

currentValue += sum(list1)

また:

for x in list1:
    currentValue += x

リスト内包表記は素晴らしいです、私はそれらを愛していますが、謙虚なループには何も問題forはなく、それを使用することを恐れるべきではありません:-)

編集:「しかし、収集した値とは異なるインクリメントをしたい場合はどうすればよいですか?」

さて、あなたは何を増やしたいですか?あなたのコマンドで python の全機能を利用できます!

X 2 乗で増分しますか?

for x in list1:
    currentValue += x**2

リスト内の x とその位置の関数によってインクリメントしますか?

for i, x in enumerate(list1):
    currentValue += i*x
于 2009-04-21T23:46:55.800 に答える
1

まず第一に、おそらく使いたくないでしょうprint。何も返さないので、for印刷したいだけなら従来のループを使用してください。あなたが探しているものは次のとおりです。

>>> list1 = (1,2,3,4)
>>> list2 = [(i, i*2) for i in list1] # Notice the braces around both items
>>> print(list2)
[(1, 2), (2, 4), (3, 6), (4, 8)]
于 2009-04-21T22:18:18.587 に答える
1

リスト内包表記で print を呼び出すのは奇妙なことです。機能しないコードだけでなく、必要な出力を示していただけると助かります。

ここにあなたのための2つの推測があります。いずれにせよ、重要な点は、リスト内包表記の値ステートメントは単一の値でなければならないということです。一度に複数のアイテムを挿入することはできません。(それがあなたがやろうとしていることである場合は、2 番目の例にスキップしてください。)

list1 = [1, 2, 3]
list2 = [(i, i*2, i) for i in list1]
# list2 = [(1, 2, 1), (2, 4, 2), (3, 6, 3)]

フラットリストを取得するには:

list1 = [1, 2, 3]
tmp = [(i, i*2) for i in list1]
list2 = []
map(list2.extend, tmp)
# list2 = [1, 2, 1, 2, 4, 2, 3, 6, 3]

編集: リスト内包表記の途中で値をインクリメントすることは、依然として奇妙です。本当にそれを行う必要がある場合は、通常の for ループを記述し、値を追加する方がよいでしょう。Python では、そのような賢さはほとんどの場合、「非 Pythonic」としてブランド化されています。必要に応じて実行してください。ただし、このようなフォーラムでは、後を絶ちません。;)

于 2009-04-21T22:25:15.560 に答える
0

複数のステートメントを実行することはできませんが、関数呼び出しは実行できます。上記のようにするには、次のようにします。

list1 = ...
list2 = [ (sum(list1[:i], i) for i in list1 ]

一般に、リスト内包表記は python の「機能」部分の一部であるため、... 関数に制限されます。他の人々は、必要に応じて独自の関数を作成できると提案しており、これも有効な提案です。

于 2009-04-21T22:36:57.607 に答える