Pythonでリストの内包で複数のステートメント?
-
13-09-2019 - |
質問
それはのようなものを持つことが可能です。
list1 = ...
currentValue = 0
list2 = [currentValue += i, i for i in list1]
私はそれを試みたが、うまくいきませんでしたか?それらを書き込むための適切な構文は何でしょうか。
EDIT:print文は例でした。実際に私は、ループ外の値をインクリメントしています。
解決
ステートメントではありませんのPythonでの式の内側に行くことができます<全角>。それは意図的言語の外に設計された合併症でした。この問題については、合併症を使用してみてください。の言語にそれを作った:発電機を。ウォッチます:
def total_and_item(sequence):
total = 0
for i in sequence:
total += i
yield (total, i)
list2 = list(total_and_item(list1))
発電機は、これまでに見たアイテムの実行中の集計を保持し、あなたのような例がそうしようと、それは見た目だけのように、各項目にそれを接頭辞。もちろん、簡単なループが先頭に空のリストを作成し、ちょうどAPPEND()多くを呼び出すこと、さらに簡単かもしれません! : - )
他のヒント
私はあなたが何をしようとしてはかなりよく分からないが、それはおそらく、
のようなものです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]
ここで別の質問をhref="https://stackoverflow.com/questions/364621/python-get-position-in-list/364769#364769"> 列挙発生器はIに入る2つのタプルを返し、X [i for i,x in enumerate(testlist) if x == 1]
、あなたはカウンタ値を追跡するためにので、ここであなたがクロージャを使用することができ、機能を使用することができます:
# defines a closure to enclose the sum variable
def make_counter(init_value=0):
sum = [init_value]
def inc(x=0):
sum[0] += x
return sum[0]
return inc
そして、あなたはリスト1でやりたいます:
list1 = range(5) # list1 = [0, 1, 2, 3, 4]
そして今、たった2行で、我々はリスト2を取得します:
counter = make_counter(10) # counter with initial value of 10
list2 = reduce(operator.add, ([counter(x), x] for x in list1))
最後に、リスト2には含まれています:
[10, 0, 11, 1, 13, 2, 16, 3, 20, 4]
これは、あなたが望んでいる、とあなたは1回の呼び出しでループした後、カウンタの値を取得することができます:
counter() # value is 20
最後に、あなたが欲しいの操作のいずれかの種類によって閉鎖のものに置き換えることができ、ここでは増分を持っているが、それはあなた次第です、本当に。 注また、我々が使用することをLIST2を平らにするために削減し、この小さなトリックを減らすと行を呼び出す前に、の演算子のをインポートする必要があります:
import operator
まず第一に、あなたはおそらく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)]
印刷は、リスト内包で呼ばれる奇妙なことです。あなたは私たちを示した場合は動作しませんコードだけ、あなたが望むものを出力しませ役立つと思います。
ここではあなたのための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]
編集: リスト内包の途中で値をインクリメントすることは、まだ奇妙です。あなたが本当にそれを実行する必要がある場合は、あなただけのループのために定期的に書き込み、あなたが行くように値を追加する方がいいでしょう。 Pythonでは、そのような賢さは、ほぼいつものようにブランド化された「unpythonic。」あなたがしなければならない場合は、それを行うが、あなたは、このようなフォーラムで非難の終わりを取得しません。 ;)
編集した例を示します。
currentValue += sum(list1)
または
for x in list1:
currentValue += x
リストの内包表記は、私は彼らを愛し、素晴らしいですが、謙虚なfor
ループには何の問題もありませんし、あなたはそれを使用することを恐れてはならない: - )
EDIT:「しかし、私が収集された値とは異なる増分をしたい場合は?」
さて、あなたはインクリメントする何をしたいですか?あなたのコマンドでのpythonの全体の力を持っている!
X二乗によってインクリメント?
for x in list1:
currentValue += x**2
いくつかのxの関数、リスト内のその位置によってインクリメント?
for i, x in enumerate(list1):
currentValue += i*x
なぜあなたは、重複したリストを作成します。それはちょうど内容を加算さだろう、すべてそのリストの内包表記のように思える。
なぜないだけます。
list2 = list(list1) #this makes a copy
currentValue = sum(list2)
あなたは複数の文を行うことはできませんが、関数呼び出しを行うことができます。あなたは上記の望むように見えるものを行うには、あなたが行うことができます:
list1 = ...
list2 = [ (sum(list1[:i], i) for i in list1 ]
リストの内包表記は、Pythonの「機能」部分の一部であるため、一般的に、あなたはに...機能制限しています。他の人々が必要な場合は、独自の関数を書くことができ、そしてそれはまた、有効な提案だと示唆している。