2017-08-19 4 views
0

条件を満たすリストにいくつかの要素を追加したいので、forループでそれを行うためにジェネレータを使いました。問題は、同じジェネレータを使用して2番目のリストを作成するときに発生します。問題は、最初の要素が私が望む要素を取得し、2番目の要素が空の要素を返すことです。ここでは、コードは次のようになります。2つの変数i、jのPythonのif文を使ってforループを使うと空リストを返す

import itertools 
n = 4 
xxvars = [["x."+str(i+1)+"."+str(j+1) for j in range(n)]for i in range(n)] 
yyvars = [["y."+str(i+1)+"."+str(j+1) for j in range(n)]for i in range(n)] 

gen = ((i,j) for i,j in itertools.product(range(n),range(1,n)) if i != j) 

thevars1 = [xxvars[i][j] for (i,j) in gen] 
thevars2 = [yyvars[i][j]for (i,j) in gen] 

これが返されます。

thevars1 = ['x.1.2','x.1.3','x.1.4','x.2.3','x.2.4','x.3.2','x.3.4','x.4.2','x.4.3'] 
thevars2 = [] 

を所望の出力は次のようになります。

thevars1 = ['x.1.2','x.1.3','x.1.4','x.2.3','x.2.4','x.3.2','x.3.4','x.4.2','x.4.3'] 
thevars2 = ['y.1.2','y.1.3','y.1.4','y.2.3','y.2.4','y.3.2','y.3.4','y.4.2','y.4.3'] 

は私のコードに何か問題があるのか​​、私は他の何かが足りないのですか?

+0

はあなたのシフトキーがそれはあなたがコードの中で答えを与えることをうれしいですが、あなたは本当にOPなぜ彼らのコードのISN」に説明しなければならない答え –

答えて

1

ジェネレータ式が1回以上反復されると、再度繰り返すことはできません。

これを確認するには、next(gen)を実行して、StopIteration例外を発生させます。

>>> next(gen) 
Traceback (most recent call last): 
    File "<ipython-input-41-8a6233884a6c>", line 1, in <module> 
    next(gen) 
StopIteration 

はその後

def create_generator(): 
    for i,j in itertools.product(range(n),range(1,n)): 
     if i != j: 
      yield i, j 

あなたは

thevars1=[xxvars[i][j] for (i,j) in create_generator()] 
thevars2=[yyvars[i][j]for (i,j) in create_generator()] 
としてそれを呼び出すことができますが、機能

def create_generator(): 
    return ((i, j) for i, j in itertools.product(range(n), range(1,n)) if i != j) 

からそれを返すことができ、発電機を複数回使用したり、発電機の構文を使用するには

+1

おかげで壊れています働いている。 「他の答えは正しい」と言うのは新しい答えを投稿する価値はありません。特に、@Andrewはすでに彼の答えに優れたコードを持っています –

1

genはジェネレータオブジェクトです。ジェネレータオブジェクトが消費されると、それを再利用することはできません。ジェネレータオブジェクトを再度生成するには、それを呼び出す必要があります。

1

他の回答は両方とも正しいです。ここであなたが望むものを達成するための1つの方法は次のとおりです。

import itertools 
n=4 
xxvars=[["x."+str(i+1)+"."+str(j+1) for j in range(n)]for i in range(n)] 
yyvars=[["y."+str(i+1)+"."+str(j+1) for j in range(n)]for i in range(n)] 

def f(): 
    return ((i,j) for i,j in itertools.product(range(n),range(1,n)) if i!=j) 
thevars1=[xxvars[i][j] for (i,j) in f()] 
thevars2=[yyvars[i][j] for (i,j) in f()] 
+0

ため – TerryA

+0

あなたは正しいですが、私がこれを投稿したときに彼の答えにコードはありませんでした。他の人はすでにそうしていたので、私は説明をしなかった。 –

関連する問題