2012-03-16 11 views
1

私はPythonでこのように書き、簡単なコードを持っている:あなたが見ることができるようにPythonコマンドは動作しますが、なぜですか?

a = [1,2,3] 
b = [2,4,6] 

def union(a,b): 
    pos = 0 
    while pos < len(b): 
     n = b[pos] 
     if n in a is not 'True': 
      a = a 
     else: 
      a.append(n) 
     pos = pos +1 
    return a 

print union(a,b) 

を、最初のIF文は意味がありません。しかし、私がそれをこのようにコード化すれば:

if n in a is 'True': 
    a.append(n) 

それは働かない。最初のコードセグメントはa = [1,2,4,6] - リスト 'a'にはないリスト 'b'からの数字のみをすでに変更しています。 「IF」スニペットを「true」に変更した場合、それは機能しません。

この関数は、私が意図したとおりのものですが、それはきれいではないと思います。なぜなら、 "aのnが 'True'なら、" ifのelse部分と等しくない "if aのnは 'True': "関数ではありません。

誰か理解してもらえますか?

答えて

1

あなただけTrueない文字列を使用する必要があります'True'

またはより良いまだ、ちょうど

if n not in a: 
    a.append(n) 

あなたが初心者であれば、あなたはPythonが呼ばれるビルトインタイプを持っていることを気づいていない可能性がありset

setオブジェクトには既に交差/結合などのメソッドがあります。

3

これは、ブールチェックを使用して、文字列とそれを比較するために非常にニシキヘビの方法ではありませんので、このようにそれを行う方が良いでしょう:

a = [1,2,3] 
b = [2,4,6] 

def union(x,y): 
    for v in y: 
     if v not in x: 
      x.append(v) 
    return x 

print union(a,b) 

OR:

a.extend(set(b).difference(set(a))) 
print a 
>>> [1, 2, 3, 4, 6] 

OR場合あなたは、新しいオブジェクトが作成よりも気にしない:あなたが使用することができます

print list(set(a).union(b)) 
0

if n in a 
代わり

又は

if n not in a 

2

inis/is notは両方関係演算子であり、Pythonで関係演算子が連鎖されています。したがって、n in a is not 'True'n in a and a is not 'True'に相当し、n in a is 'True'n in a and a is 'True'に相当します。明らかに、これらはともにn in aなので、お互いの否定ではありません。

しかし、必要があるとわからない限り、isを使用しないでください。また、ブール値と比較しないでください(yadda yadda以外)。

関連する問題