2011-10-07 9 views
9

リストの理解の中で複数のコマンドを実行する方法を知りたいと思います。list comprehension pythonの複数のアクション

あなたのような単純なもののために私に例を与えることができます:

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

ので、4長さ4のリストについては、私が持っているでしょう:

bla1 
bla2 
bla1 
bla2 
bla1 
bla2 
bla1 
bla2 

をDtrangely十分な私はそれを容易に見つけることができませんでしたドキュメントに記載されています。 (もしあなたが私がしなかった明白な理由を知ることができれば、私はそのようなものを探すべきであると私に知らせることができます。

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

+2

リストの内容を複雑にすると、複雑になりすぎる可能性があります。わかりにくいです! –

+0

Python 3では、 'print'は関数であり、そのコードの単純な変形が機能します。しかし、それを行うにはまだ悪い方法です。 –

+0

「2つのコマンド」?あなたはあなたがこれによって何を意味すると思うかの例を挙げることができますか?それははっきりしていません。 "コマンド"には、Pythonの正式な意味はありません。あなたは "声明"を意味しますか?もしそうなら、リストの理解はうまくいかない。あなたは "機能"または "表現"を意味しますか?そうであれば、その例が2つの表現である理由を明確にするのに役立ちます。 –

答えて

21

コマンドにリスト内包を使用しないでください。リストの解説はのリストの作成であり、コマンドではありません。です。昔ながらのループを使用します。

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

リスト内包はユニコーンとチョコレートの完全な素晴らしい素晴らしいものですが、彼らはすべてのために解決策はありません。

+3

私はそれらを魔法と呼んでいません。 – varunl

+2

あなたはそうです。私は今、否定的な意味がないことを意味していることを明確にしました。 –

+0

これを指定するPEPには何か、それとも単に人々が従う傾向のあるものがありますか?コマンドにlist-compsを使っている人がたくさんいます。 –

2
  1. リストの補完は、ステートメント(またはファイルへの書き込みなどのその他の副作用)を複数回実行するのではなく、リスト形式でデータを生成するためのものです。 forを使用してください。

  2. リストを生成すると仮定します。['bla1', 'bla2', 'bla1', ...]:一般的に行うことはできません。各反復では、1つの結果値がリストに追加されます。その値はリスト自体でも構いませんが、リストのリストがあります。あなたの例のように、特定のケースでは

  3. 、それはしかし可能です。これを使用する['bla' + str(i + 1) for x in list for i in range(2)]、すべてのx in listためrange(2)を反復し、list内の項目ごとに2つの値を生成します。 (それはすでに組み込みによってかかったようlistは、しかし、変数のための悪い名前です。)

1

「私は2つのコマンドを必要とする」、彼らが何らかの方法で関連していなければならない、二つの機能があることを意味します。

def f(element): 
    return intermediate 

def g(intermediate): 
    return final 

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

ことが適切でない場合は、(a)は構成され、まだまた、(b)は、新たなシーケンスのための単一の結果を作成することができない関数の定義を提供する必要があります。

0

リストの作成は、リストの作成にのみ使用します。あなたの例ではあなたのリストの値はまったく使用されません。

文書によると、
"リスト内包表記は、シーケンスからリストを作成する簡潔な方法を提供します。"

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

上記のプログラムでは、リストの値については気にしませんでした。あなたがあなたの問題で述べたこととは異なるリスト理解のアプリケーションを探していたら、投稿してください。

0

リスト内包表記の主な出力を無視しながら、リスト内包表記で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]] 

が、これはNonesとリストの冗長リストを吐き出すん

>>> 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] 

(編集で説明OPよう)各サブリストを操作することによって、新しいリストを作成、しかし:たとえば取ります変数new_listに、サブリストの積と合計を入力します。

6

あなたはこのようにその仕事をするためにタプルを使用することができます。

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

それは正しく仕事です。

+0

これは私を助けました...ちょうど 'tuple'の中でそれを書くのがなぜうまくいったのですか? –

関連する問題