2010-12-13 5 views
3

タイトルのように、Pythonでネストされたリストの理解の中で使用される変数(つまりリスト)の名前を付ける方法はありますか?Pythonのネストされたリスト内包の変数の命名は?

私は適切な例を思いつくことができましたが、私はその質問が十分にはっきりしていると思います。ここで

は、擬似コードの例です:

[... [r for r in some_list if r.some_attribute == something_from_within_this_list comprehension] ... [r for r in some_list if r.some_attribute == something_from_within_this_list comprehension] ...]

はリスト内包内で使用するために、この一時的なリストのための変数を追加し、ここで、単純反復を回避するための方法はありますか?

明確化: リスト内包はすでに正常に動作しているので、それはそれは、リストの内包表記で行うことができます "の問題ではありません。それはfor文の元の形よりも速いので、for文とlist comprehensionsのどちらの質問でもありません。これは単に、リストの理解の内部変数だけを変数名にすることで、リストの理解をより読みやすくするという問題です。私の周りのグーグルでは本当に答えが見つかりませんでした。私はthisthisを見つけましたが、それは私が後になっていることではありません。

+0

不明。あなたは「私は変数を何と呼ぶべきですか?」という意味ですか?または「リスト内包の中でどのように変数を割り当てることができますか」という意味ですか?あなたは「どのようにリスト内包を入れ子にするのですか?」という意味ですか?または何か他のもの? –

+5

'しかし、その質問は十分に明確だと思います。真剣に? -1 – Falmarri

+0

ええ、例が良いだろう。 –

答えて

3

あなたが何をしたいの私の理解に基づいて、ありませんあなたがそれを行うことはできません。ただ、変数に部分式を割り当てることしないでください。

リストの内包が他のいくつかの例があるが、それらはすべてそのような程度だ確か

[expression(x, y) for x in expression_that_creates_a_container 
        for y in some_other_expression_that_creates_a_container(x) 
        if predicate(y, x)] 

フォームから本質的であるので、あなたは、リストの内包表記で割り当てを行うことができません。名前の割り当てと同じステートメントのための余地がどこにもないことに注意してください。したがって、for my_variable in構文を使用する以外は、リストの理解の文脈で名前に割り当てることはできません。

リストの理解が機能している場合は、それを投稿して簡略化できるかどうかを確認することができます。 itertoolsに基づく解決策は、しばしばバーリーリスト内包表記の良い代替手段です。

+0

一日の終わりには、それは技術的な視覚的な強化です。私はすでにリストの理解に満足しています。しかし、itertoolsのヒントをありがとう、私は非常に便利なモジュールを見落とした。 – c00kiemonster

0

私は本当に何をしようとしているのか分かりませんので、私はちょうどここに足を出すつもりです。私はちょうどあなたが単一の表現にすべきではないよりも靴ひねりを増やそうとしていると推測しています。

sublist = [r for r in some_list if r.some_attribute == something_from_within_this_list comprehension] 
composedlist = [... sublist ... sublist ...] 
+0

私はそれを行うことができましたが、私はサブリストはリストの理解から来る条件で構成されています。リストの理解の外に持ち込むことが不可能になります。その場合には – c00kiemonster

+0

@ c00kiemonster、あなたがしようとしていることは、リスト内包表記で行うことができるのではないかと疑います。ループに使用します。 –

+0

@ c00kiemonster - [compulsions]ではなく、[generators](http://wiki.python.org/moin/Generators)を少し使って恩恵を受けるようです。 – detly

2

私はあなたが意味するものを正確に理解していると思いますが、私はこの問題の「部分的な解決策」を考え出しました。ソリューションは正常に動作しますが、効率的ではありません。

私は例を挙げて説明しましょう:

私はちょうどそれを解決するために、1000 Pythonのコードだけであるた合計ピタゴラスのトリプレット解決しようとしていた。

def pythagoreanTriplet(sum): 
    for a in xrange(1, sum/2): 
     for b in xrange(1, sum/3): 
      c = sum - a - b 
      if c > 0 and c**2 == a**2 + b**2: 
       return a, b, c 

をしかし、私はコードをしたかったですその関数型プログラミングのようなスタイルで:

def pythagoreanTriplet2(sum): 
    return next((a, b, sum-a-b) for a in xrange(1, sum/2) for b in xrange(1, sum/3) if (sum-a-b) > 0 and (sum-a-b)**2 == a**2 + b**2) 

コードからわかるように、私は3回(合計-AB)をカルク、と私は避けるために内部varibleに結果を格納したかったです冗長計算。それが正常に動作します...しかし、私はポストの開始時に言ったように、ではありません

def pythagoreanTriplet3(sum): 
    return next((a, b, c) for a in xrange(1, sum/2) for b in xrange(1, sum/3) for c in [sum-a-b] if c > 0 and c**2 == a**2 + b**2) 

:私はそれを行うために見つけた唯一の方法は、内部変数を宣言するために単一の値を持つ別のループを追加することによりでした効率的な方法。 cProfileとの3つの方法を比較すると、それぞれの方法のために必要な時間は次のものである:

  • 最初の方法:0.077秒
  • Secnd方法:0.087秒
  • 第三の方法:0.109秒
1

一部の人々は、以下を「ハック」として分類できますが、場合によっては間違いなく役立ちます。

f = lambda i,j: int(i==j) #A dummy function (here Kronecker's delta)  
a = tuple(tuple(i + (2+f_ij)*j + (i + (1+f_ij)*j)**2 
       for j in range(4) 
       for f_ij in (f(i,j),)) #"Assign" value f(i,j) to f_ij. 
      for i in range(4)) 
print(a) 
#Output: ((0, 3, 8, 15), (2, 13, 14, 23), (6, 13, 44, 33), (12, 21, 32, 93)) 

このアプローチは、機能fが評価するのに費用がかかる場合に特に便利です。それはやや珍しいので、上記のように、「割り当て」行を文書化することをお勧めします。

関連する問題