2016-07-21 15 views
1

So bin ich nicht genau sicher, wie diese Frage genau zu stellen, aber im Grunde möchte ich sehen, ob ein Wert zwischen zwei Variablen auch zwischen zwei anderen Variablen ist. So zum Beispiel hier ist ein Beispiel, was Code wie die aussehen könnte, was ich zu erklärenmehrere Bedingungen in bedingten

var1 = 0 
var2 = 20 
var3 = 5 
var4 = 15 
if var3 <= [any value in range var1 to var2] <= var4: 
    do something 

so das ist im Grunde, aber ich bin mir nicht sicher, was anstelle der Klammern gehen würde, oder ob es eine andere ist Weg, es zu tun. Tut mir leid, wenn es eine einfache Lösung gibt, ich bin ziemlich müde. Vielen Dank!

Antwort

2

Ich bin überrascht über die Komplexität der anderen Antworten.Dies sollte einfach sein:

def intersect(a, A, x, X): 
    '''Return True if any number in range(a, A+1) is in range(x, X+1).''' 
    return a <= X and x <= A 

Beachten Sie, dass Kreuzung symmetrisch ist, so intersect(a,b,x,y) == intersect(x,y,a,b) immer hält.


Alle Schnittmöglichkeiten:

a...A 
x..X 

    a...A 
x..X 

    a...A 
    x..X 

    a...A 
    x..X 

    a...A 
    x..X 

    a...A 
    x..X 

    a...A 
     x..X 

    a...A 
     x..X 

Welche der obigen Funktion entspricht.


Schließlich, um sicherzustellen, dass dies als John Kugelman Antwort nicht anders:

def their(a, b, x, y): 
    return ((x <= a <= y or x <= b <= y) or (a <= x <= b or a <= y <= b)) 

def my(a, A, x, X): 
    return a <= X and x <= A 

from itertools import product 
for x in product(range(5), repeat=4): 
    if my(*x) != their(*x): 
    if x[0] <= x[1] and x[2] <= x[3]: 
     print('[{1}, {2}] and [{3}, {4}] intersect according to {0}.' 
      .format('me' if my(*x) else 'them', *x)) 
    else: 
     print('{} say it intersects, when input is incorrect.' 
      .format('I' if my(*x) else 'They')) 

Lauf dies als python intersect.py | uniq -c Ausgänge:

140 They say it intersects, when input is incorrect. 
0

Denken Sie immer daran, wenn Sie eine Bedingung für einen Wert einstellen wollen lässt, sagen ‚a‘ zwischen x und y, können Sie eine Bedingung festgelegt, a>x and a<y, das ist, was Sie wollen:

if var3 >= var1 and var3 <= var2 and var3 <=var4: 
    do something 

Ich bin nicht 100% sicher, ob var3 sowohl var3 >= var1 and var3 <= var2 and var3 <=var4 als auch var3 var3 >= var1 and var3 <= var2 or var3 <=var4 sein soll, nehmen Sie bitte Änderungen entsprechend Ihrer erwarteten Ausgabe vor.

Hoffen, dass dies hilft, lassen Sie mich wissen, wenn es für Sie nicht funktioniert. Dies ist ein klassisches Beispiel, aber nicht die Art und Weise pythonic aber :)

+1

korrekte Syntax ist * und * statt * && * in Python. –

+0

Danke @TedKleinBergman aktualisiert :) – Jordon

+1

'&&' -> 'und' in Python –

0

Sie meinen doch zu:

for i in range(var1, var2+1): 
    if var3 <= i <=var4: 
     do something 
+0

'etwas' wird oft ausgeführt. Sie sollten 'if any (var3 <= i <= var4 für i im Bereich (var1, var2 + 1))' verwenden, aber selbst das ist unnötig kompliziert. – arekolek

1

ist ein bisschen mathematischer Notation verwenden lassen. Sie haben also zwei Nummernkreise, [ein, b] und [x, y], wobei [ein, b] stellt das Konzept der „alle Zahlen zwischen ein und b ".

Eine Interpretation ist, die Sie sehen wollen, wenn [ein, b] ist eine Teilmenge von [x, y].

if a >= x and b <= y: 
    ... 

Ein weiterer Grund ist, dass Sie sehen wollen, wenn [ein, b] schneidet [x, y] in keiner Weise. Das geschieht, wenn eine der beiden Endpunkte a oder b innerhalb enthalten ist [x, y], oder umgekehrt.

if ((x <= a <= y or x <= b <= y) or 
    (a <= x <= b or a <= y <= b)): 
    ... 
+0

[Das ist unnötig kompliziert.] (Http://www.wolframalpha.com/input/?i=a%3C%3Db+and+x%3C%3Dy+and+%28%28%28x+%3C%3D+) a +% 3C% 3D + y + oder + x +% 3C% 3D + b +% 3C% 3D + y% 29 + oder +% 28a +% 3C% 3D + x +% 3C% 3D + b + oder + a +% 3C% 3D + y +% 3C% 3D + b% 29% 29% 29) – arekolek

0

Unter der Annahme, dass es nicht eine Ordnung unter den Variablen, die vor der Zeit bekannt ist ....

min34 = min(var3, var4) 
max34 = max(var3, var4) 

if ((min34 < var1 && max34 > var1) || (min34 < var2 && max34 > var2)) : 
    do something 

Use „< =“ und „> =“, wenn der Rand des Bereichs zählt als "dazwischen".