2016-07-05 7 views
1

が誰かの意味に次のコード行の後ろの構文説明していただけます。違い - パイソン - 構文の説明

​​

を私はそれが2つのリストの違いを見つけるためだ理解が、「Xを何'ここに表現する?比較されるリスト内の個々の要素はどれですか? temp1sはリストであることを理解しています。また、x for xは同じ変数を持つ必要がありますか?x for yでもかまいませんか?

+0

https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions – niemmi

答えて

2

それはtemp3に含める前sないかどうかを確認するためにtemp1をチェックして、各要素を反復処理します。

それはtemp1sは、あなたが比較されている2つのリストです

temp3 = [] 
for item in temp1: 
    if item not in s: 
     temp3.append(item) 

を書いて短く、より神託の方法です。

あなたの2番目の質問については、x for yはうまくいくでしょうが、意図した通りではないでしょうし、確かに非常に有用な方法ではありません。 temp1の各項目を変数名yに割り当て、リスト内包範囲外の範囲でxを検索します。 xが前に定義されていると仮定すると(そうでなければNameErrorなどが得られます)、条件if x not in stemp1のすべての項目について同じことが評価されます。そしてその条件が真であれば、temp3にはxが設定されます。 yの値は未使用です。

これは、リスト内包で異なる変数を使用することは決して役に立たないと言ってはいけません。実際に[a if condition(x) else b for x in original_sequence]のようなリストの理解は、しばしば非常に便利です。 [a for x in original_sequence if condition(x)]のようなリストの理解は、original_sequenceの項目の数がcondition()を満たす項目の数と同じ数のaを含むリストを作成するのにも役立ちます。

-2

Xは同じ変数であり、yではありません。それはとてもx for xコード

newList = [] 
for x in temp1: 
    if x not in s: 
    newList.append(x) 

以下と同じように動作し、ここで最初のTEMP1におけるxのと同じであるために後に内部コードとXに追加されたXです。

-1

は自分で試してみてください。

arr = [1,2,3] 
[x+5 for x in arr] 

これはあなたを与える必要がある[6、7、8] [1,2,3]リストプラス5.この構文上の値であること(リスト内包として知られていますまたはマッピング)。これは、同じ命令をリストのすべての要素に適用します。これを行うと同じようになります:あなたは右に左に全部を読むことができるように

for x in arr: 
    arr += 5 
4
[x for x in temp1 if x not in s] 

それは、わずかにする再ためにそれを助けるかもしれません。最初にxを最後まで移動しましょう。

[for x in temp1 if x not in s yield x] 

それが英語として自然に読み込むので、私は偽物yieldキーワードを追加しました。コロンを追加すると、コロンがいっそう明確になります。

[for x in temp1: if x not in s: yield x] 

本当に、これは物事がで評価を受けることに順序がある。x変数がforループから来て、あなたがifyield句で参照できる理由です。しかし、リスト内包表記が書かれている方法は、値を前に出すことです。つまり、まだ定義されていない変数名を使用することになります。

実際、この最終的な書き換えは、明示的なジェネレータ関数を書く方法とまったく同じです。

def func(temp1, s): 
    for x in temp1: 
     if x not in s: 
      yield x 

あなたがリストに発電機と同等の取得func(temp1, s)呼び出した場合。 list(func(temp1, s))でそのリストにすることができます。