2016-05-22 11 views
6

私はx、y、zという3つの変数のセットを持っていて、がすべて同じ値を共有しているかどうかチェックしたいと思っています。私の場合、値は1または2のいずれかになりますが、すべて同じかどうかを知る必要があります。現在、私は私が見つけた答えを探してい Python - 複数の変数が同じ値を持っているかどうかを調べる

if 1 == x and 1 == y and 1 == z: 
    sameness = True 

を使用しています:

if 1 in {x, y, z}: 

しかし、これは

if 1 == x or 1 == y or 1 == z: 
    atleastOneMatch = True 

として動作することは1がそれぞれにあるかどうかを確認することが可能です:x、y、z? さらに、x、y、zが同じ値であるかどうかをより簡単に調べる方法はありますか?

(重要なのは、私はPython 3を使用します)

答えて

13

あなたは、任意の順序を持​​っている場合は、generator expressionall() functionを使用します。

values = [x, y, z] # can contain any number of values 
if all(v == 1 for v in values): 

そうでない場合は、ちょうど==上のすべての3つの変数を使用します。

if x == y == z == 1: 

あなたは彼らだけが全て同じ値(あるにかかわらず、何の値)であれば、使用を知るために必要な場合:

if all(v == values[0] for v in values): 

または

if x == y == z: 
+0

第について1:我々はこれを使うこともできます:values [1:] == values [: - 1] –

+1

@DeSanta:それは2つの新しいリストを作成します。 –

+0

うわー。私はそれを知っている。どのように説明できますか? –

2

どうやってですか?

x == y == z == 1 
1

別の方法:

sameness = all(e == 1 for e in [x, y, z]) 
3

彼らはすべてしているかどうかを確認するには同じ(1または2のいずれか):

sameness = (x == y == z) 

括弧はオプションですが、私はそれが可読性

0を向上させ見つけます
1

あなたが持っているものと同様のものを使用することができます

sameness = (len({x, y, z}) == 1) 

をこれは、任意の数の変数が可能になります。例えば:

variables = {x, y, z, a, b, ...} 
sameness = (len(variables) == 1) 

注:のセットを作成するには、各変数がハッシュされる必要があり、ハッシュ値を格納する必要はなく、発電機発現とall()が短絡され、2つだけのトラックを保持することを意味します値を一度に表示します。したがって、その可読性の他に、ジェネレータの表現がより効率的です。私の場合は

+0

'set'動作をうまく使っていますが、ちょっと意図を隠していると思いませんか? –

+0

@ das-g:幸いにも、変数名は意図を明確にします。意図が明確になると、コードがどのように機能するかを簡単に確認できます。 – zondo

+3

セットの作成にはコストがかかりません。各値はハッシュされなければなりません(等価性テストに加えて)。さらに、設定されたオブジェクト自体のメモリ割り当てが必要です。 'all()'をジェネレータ式または '==' * short circuit *の連鎖で置き換えることで、少なくとも1つの値が他の値と等しくない場合、すべての値をテストする必要はありません。 –

1

、値は1または2、ではなく、私は彼らだけがすべて同じ

はそれが可能1かどうかを確認することですされているかどうかを知る必要がありますそれぞれx、y、zにありますか? さらに、x、y、zが同じ値であるかどうかをより簡単に調べる方法はありますか?

確か:あなたが比較する値の任意の(ゼロでない)数を有する場合

x == y == z 

(x == y) and (y == z) 

と等価である:

all(values[0] == v for v in values[1:]) 
関連する問題