2017-09-28 1 views
1

次のコードを1行で記述しようとしています。フローコントロールを使用したネストされたリストの理解

for x in range(a, b+1): 
    prime = True 
    for y in range(2, int(x**0.5)): 
    if x%y == 0: 
     prime = False 
     break 
    if prime: 
    return x 

これは、aとbの間の素数を検索します。各素数をリストに保存します。上記のコードは、範囲内の各数値を素数性をチェックしています。問題は、このネストされたループを1行のリストの理解として書く必要があることです。私が持っている問題は、リストの理解が2番目のループを通らないということです。それは2でチェックし、ループから飛び出します。

私はこのアプローチを試みたが、それは無残に失敗しました: ([x for x in range(10, 21) for y in range(2, int(x**0.5)) if x%y != 0])

+0

あなたが示したコードは意味がありません。 'next'はイテレータで呼び出すことのできる組み込み関数ですが、ここで使用しているようなステートメントではありません。あなたはおそらく「続ける」という意味ですか?これはステートメントですが、正しく動作するためにはアルゴリズムが必要と思う外側のループを続行しません。 'if'で' break'を使い、 'for'ループ(Python構文の奇妙なビット)に付けられた' else'ブロックに 'return'行を置くことで、これを動作させることができます。 – Blckknght

+0

なぜそれがループから "ポップ"すると思いますか?あなたが提示したコード行は目に見える出力を生成しません。大括弧で囲まれたコードの部分は、通常は変数名にバインドするリスト内包です。たとえば、それを印刷することができます。その場合にのみ、その中に何かがあるかどうかを確認します。 –

+0

なぜそれをリストの理解として書くのですか?リストは必要ありません。単一の値が必要です。 – chepner

答えて

0
Prime_numbers_list = [x for x in range(a, b+1) 
         if all(x%y !=0 for y in range(2, int(x**0.5)))] 
+0

x/2はx ** 0.5と同じではありません。 –

+0

これは完全に機能します!私はすべての機能について知りませんでした。それは非常に役に立ちます。 – ddcastrodd

+0

@ddcastrodd、私は素数の完全な*リストが1,4,6,8,9,15,25,35などを含むとは思わないこのコードは現在実行しているときに生成されます。バグは 'int(x ** 0.5)'は範囲の終点であるので 'int(x ** 0.5)+ 1'でなければなりません。 – cdlane

2

私は、モジュール式の結果の内部リストを作成し、任意のゼロがあるかどうかを確認します:

[x for x in range(10, 21) if 0 not in (x%y for y in range(2, int(x**0.5)))] 
1

た場合、私はあなたの意図を正しく理解すれば、abの間の最小の素数を1行で見つけようとしています。あなたは現在のコードをいくつか持っていますが、あなたが示したものは意味をなさないものです。私はあなたが表示さしようとしたロジックは次のように仕事ができると思う:ワンライナーにこれを有効にする

def find_prime_between(a, b): 
    for x in range(a, b+1): 
     for y in range(2, int(x**0.5)): 
      if x%y == 0: 
       break 
     else: 
      return x 

一つの方法は、all組み込み関数を使用することです。 breakブロックとelseブロックからの短い循環動作を含む内部ループを置き換えることができます。発電機が原因であり(何も得られない場合は、デフォルトではnext

result = next(x for x in range(a, b+1) if all(x % y != 0 for y in range(2, int(x**0.5)))) 

StopIterationが発生します:外側のループのために、私は、発電機によって得られた最初の値を取得する発電機、上nextを呼び出すと、使用することをお勧めしたいですabの間の素数はありません。その状況で別の値(Noneなど)を返す場合は、それをnextの2番目の引数として渡すことができます。

result = next((x for x in range(a, b+1) if all(x%y!=0 for y in range(2, int(x**0.5)))), None) 

スクロールバーなしでこの答えに、単一の行に収まるように絞るのビットを取ります。それが唯一の引数はありませんので、それは、括弧でラップするためにジェネレータ式が必要になります。

関連する問題