web-dev-qa-db-ja.com

リスト内包表記の複数のアクションpython

リスト内包表記で複数のコマンドを実行する方法を知りたいのですが。

次のような単純な例を教えてください。

[print ("bla1") and print ("bla2") for i in list]

したがって、4つの長さ4のリストの場合、次のようになります。

bla1
bla2
bla1
bla2
bla1
bla2
bla1
bla2

不思議なことに、私はそれをドキュメントで簡単に見つけることができませんでした。 (私がそうしなかった明白な理由を見ることができ、さらに良いものを検索する方法を教えてくれるなら)。

編集:わかりました、コメントによると、それは非常に悪い例でした。私am古いものから新しいものを作成することに興味がありますが、それを行うには2つのコマンドが必要だと感じています。 (もちろん、単純な印刷ではありません)。例えば。リストのリストがあり、サブリストの操作の結果であるリストを作成したいと思います。

18
Lost_DM

コマンドにリスト内包表記を使用しないでください。リスト内包表記はリストの作成用であり、コマンド用ではありません。単純な古いループを使用します。

for i in list:
    print('bla1')
    print('bla2') 

リスト内包表記は、ユニコーンとチョコレートでいっぱいの素晴らしい素晴らしいものですが、すべての解決策ではありません。

27
Petr Viktorin

タプルを使用して、次のようにそのジョブを実行できます。

[(print("bla1"), print("bla2")) for i in list]

正しく動作します。

13
Ahad aghapour
  1. リスト内包表記は、リスト形式でデータを生成するためだけのものであり、ステートメント(またはファイルへの書き込みなどの他の副作用)を複数回実行するためのものではありません。 forを使用してそれを探します。

  2. リストを生成したい場合_['bla1', 'bla2', 'bla1', ...]_:一般的には実行できません。反復ごとに、単一の結果値がリストに入れられます。その値はリスト自体である可能性がありますが、リストのリストがあります。

  3. ただし、例のような特定のケースでは、次のことが可能です。['bla' + str(i + 1) for x in list for i in range(2)]を使用します。これは、_x in list_ごとにrange(2)を反復処理するため、list。 (listは変数の名前としては不適切ですが、組み込みですでに使用されているためです。)

2
user395760

「2つのコマンドが必要」が2つの機能があることを意味する場合、それらは何らかの方法で関連している必要があります。

def f( element ):
    return intermediate

def g( intermediate ):
    return final

new_list = [ g(f(x)) for  x in old_list ]

それが適切でない場合は、(a)構成できず、(b)新しいシーケンスに対して単一の結果を作成する関数の定義を提供する必要があります。

1
S.Lott

場合によっては、2つのステートメントを含む関数を呼び出すことが許容される場合があります。

def f():
   print("bla1")
   print("bla2")

[f() for i in l]

関数に引数を送信することもできます。

def f(i):
   print("bla1 %d" % i)
   print("bla2")

l = [5,6,7]

[f(i) for i in l]

出力:

bla1 5
bla2
bla1 6
bla2
bla1 7
bla2
1
plafratt

リスト内包表記の主な出力を無視して、リスト内包表記でlist.appendを使用して、新しいリストを作成することができます。 OPはリストのリストに言及しています。たとえば、次のようにします。

>>> master = [range(x,x+2) for x in range(10)]
>>> master
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]

次に、各サブリストを操作して新しいリストを作成します(編集で説明されているOPとして)

>>> new_list = []
>>> [[new_list.append(l[0]*l[1]),new_list.append(l[0]+l[1])] for l in master]

[[None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None]]

>>> new_list

[0, 1, 2, 3, 6, 5, 12, 7, 20, 9, 30, 11, 42, 13, 56, 15, 72, 17, 90, 19]   

これにより、Noneを含むリストの冗長リストが吐き出されますが、変数new_listにサブリストの積と合計が入力されます。

0
bvanlew

リスト内包表記は、リストの作成にのみ使用してください。あなたの例では、リストの値をまったく使用していません。

ドキュメントによると:
「リスト内包表記は、シーケンスからリストを作成するための簡潔な方法を提供します。」

for i in range(len(your_list)):
  print "blah1"
  print "blah2"

上記のプログラムでは、リスト内の値についても気にしませんでした。問題で述べたものとは異なるリスト内包表記のアプリケーションを探していた場合は、投稿してください。

0
varunl