2017-02-18 4 views
3

2つの同じ長さのリストは、すべてfloat型またはint型、正または負であり、ゼロになる可能性はありません。同じインデックスのすべての値が同じ方向(正または負)かどうかを知りたいだけです。ここに論理、それを行うためのよりよい方法はありますか?彼らは同じ符号を持っている場合Pythonの2つのリストの同じインデックスの値を知る方法は、肯定的にも否定的にも同じですか?

def same_direction(list1, list2): 
    diff = [] 
    for i in len(list1): 
     if (list1[i] > 0 and list2[i] > 0) or (list1[i]< 0 and list2[i] < 0): 
      pass 
     else: 
      diff.append(i) 
    if diff: 
     return False 
    return True 

same_direction([1, 2, 3], [3, 7, 9]) True 
same_direction([-1, 2, 3], [1, 2, 3]) False 

答えて

7

あなただけzipリストは数字をペアリングし、各ペアのチェックのためにすることができます。発見され次第Falseとしての価値を終了するallで上記ラップ:

def same_direction(l1, l2): 
    return all((x > 0) == (y > 0) for x, y in zip(l1, l2)) 

print(same_direction([1, 2, 3], [3, 7, 9])) 
print(same_direction([-1, 2, 3], [1, 2, 3])) 
print(same_direction([-1, 2, 3], [-1, 2, 3])) 

出力:

True 
False 
True 

また、あなたがペアを乗算し、その結果が0より大きいかどうかを確認できます。

def same_direction(l1, l2): 
    return all(x * y > 0 for x, y in zip(l1, l2)) 
+4

を避けるべきであることを教えてくれます乗算よりも明らかでしょうか? –

+0

はい、これは私が探している答えだと思います。 – Gang

+1

@ Rob second私はあなたに同意した2番目の考えでは、大規模なintでもうまくいきます。それに応じて答えを変更しました。 – niemmi

3

コードから始めると、短絡してxorを使用してビットを保存することができます

def same_direction(list1, list2): 

    for i in len(list1): 
     if (list1[i] > 0)^(list2[i] > 0): 
      return False 
    return True 

Pythonの純粋主義者は、私が `` zip`/`ALL`に同意するだろうがない`(X> 0)==(Y> 0)1は、インデックス

def same_direction(list1, list2): 

    for l1, l2 in zip(list1, list2): 
     if (l1 > 0)^(l2 > 0): 
      return False 
    return True 
+0

'xor'、私は決してそれを使用しませんでした! – Gang

+1

ええ、それは 'すべて 'を再発明しましたが、私は助けることはできませんが、ビットごとのxorのこの使用が大好きです。 –

+0

ギャング、@ juanpa.arrivillaga私はそれが 'all'に関係するかどうかは分かりませんが、ブール値では'!= 'と同じですよ、ちょっと冷たいですね;-) –

関連する問題