2016-05-22 16 views
6

Ich habe eine Reihe von drei Variablen x, y, z und ich möchte überprüfen, ob sie alle den gleichen Wert teilen. In meinem Fall wird der Wert entweder 1 oder 2 sein, aber ich muss nur wissen, ob sie alle gleich sind. Derzeit bin ichPython - Überprüfen Sie, ob mehrere Variablen den gleichen Wert haben

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

für die Antwort der Suche die ich gefunden habe:

if 1 in {x, y, z}: 

Dies ist jedoch arbeitet als

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

Ist es möglich, zu überprüfen, ob 1 in jeweils : x, y und z? Besser noch, gibt es eine prägnantere Art zu überprüfen, einfach wenn x, y und z den gleichen Wert haben?

(wenn es darauf ankommt, verwende ich Python 3)

Antwort

13

Wenn Sie eine beliebige Folge haben, verwenden Sie die all() function mit einem generator expression:

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

sonst nur== auf allen drei Variablen verwenden:

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

Wenn Sie nur wissen mussten, wenn sie alle den gleichen Wert (unabhängig davon, welchen Wert das ist) sind, zu verwenden:

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

oder

if x == y == z: 
+0

Für das dritte Eins können wir auch verwenden: Werte [1:] == Werte [: - 1] –

+1

@DeSanta: aber das erstellt zwei neue Listen. –

+0

Wow. Ich weiß das nicht. Kannst du mir bitte erklären wie? –

2

Wie wäre das?

x == y == z == 1 
1

Ein anderer Weg:

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

Um zu überprüfen, ob sie sind alle gleichen (entweder 1 oder 2):

sameness = (x == y == z) 

Die Klammern sind optional, aber ich finde es verbessert die Lesbarkeit

1

Sie könnten etwas ähnliches verwenden, was Sie haben:

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

Diese für eine beliebige Anzahl von Variablen erlaubt. Zum Beispiel:

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

Hinweis: einen Satz erstellen bedeutet, dass jede Variable gehasht werden muss, und die Hash-Werte gespeichert werden müssen, aber all() mit einem Generator Ausdruck ist ein Kurzschluss und verfolgt nur zwei Werte auf einmal. Daher ist der Generatorausdruck neben seiner Lesbarkeit effizienter.

+0

Ordentliche Verwendung von 'Set'-Verhalten, aber irgendwie verdeckt die Absicht, nicht wahr? –

+0

@ das-g: Glücklicherweise macht der Variablenname die Absicht klar. Sobald die Absicht klar ist, ist es einfach zu sehen, wie der Code funktioniert. – zondo

+3

Erstellen eines Satzes ist nicht ohne Kosten; Jeder Wert muss (zusätzlich zu den Gleichheitsprüfungen) gehashed werden, zuzüglich der Speicherzuweisung für das Set-Objekt selbst. 'all()' mit einem Generatorausdruck oder einer Kette von '==' * short circuit *, so dass nicht alle Werte getestet werden müssen, wenn mindestens ein Wert ungleich den anderen ist. –

1

In meinem Fall wird der Wert entweder von 1 oder 2, aber ich muss nur wissen, ob sie alle gleich sind

Ist es möglich, wenn 1 zu überprüfen ist in jedem: x, y und z? Besser noch, gibt es eine prägnantere Art der Überprüfung einfach, wenn x, y und z den gleichen Wert haben?

Sure:

x == y == z 

, die

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

entspricht Wenn Sie eine beliebige (nicht Null) Anzahl der Werte vergleichen:

all(values[0] == v for v in values[1:]) 
Verwandte Themen