Как проверить, равны ли одно или два целых числа -1, среди четырех целочисленных переменных в Python3? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 4 целочисленных переменных

r1, r2, c1, c2

Они могут быть любыми целочисленными значениями.Я хочу выяснить, какие из них являются / являются -1.

Правило: r1 и r2 не может быть -1 одновременно;c1 и c2 не могут быть -1 одновременно.

Я могу использовать выражение if, но оно может быть громоздким:

if r1 == -1:        
    if c1 == -1:
        # do action a
    elif c2 == -1:
        # do action b
    else:  # c1 and c2 are both not -1
        # do action c
elif r2 == -1:
    if c1 == -1:
        # do action d
    elif c2 == -1:
        # do action e
    else:  # c1 and c2 are both not -1
        # do action f 
else:  # none of the four integers is -1.
    # do action g

Не могли бы вы показать мнекакой-нибудь более элегантный и эффективный алгоритм?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Исходя из упомянутых вами правил, т. Е. Не может быть так, чтобы r1 = r2 = -1 и c1 = c2 = -1, мы можем предположить, что существуют случаи, когда нам не нужно выполнять все четыре проверки, чтобы выяснить,переменные -1 или нет.

Чтобы использовать эти правила, вам нужно иметь некоторую структуру данных, которая отражает порядок ваших переменных и позволяет пропустить проверки, которые не требуются (например, r1 = -1, чем мыне нужно проверять r2).

Хотя это, возможно, не является более эффективным с точки зрения времени процессора, оно следует логике, что нет необходимости выполнять все проверки переменных в каждом сценарии:

d = {'r1' : 0, 'r2' : -1, 'c1' : -1, 'c2' : 0}

def isMinusOne(x):
    if x == -1:
        return x

i = 0
while i < len(d):
    if isMinusOne(list(d.values())[i]) is not None:
        print(list(d.keys())[i])
        if i == 0 or i == 2:
            i += 2
        else:
            i += 1
    else:
        i += 1
0 голосов
/ 20 ноября 2018

Я не думаю, что у вас есть проблема с эффективностью, но вы можете улучшить читабельность, проверив два недопустимых сценария, которые вы упомянули явно:

if r1 == -1 and r2 == -1:
    raise Exception("r1 & r2 are -1")
elif c1 == -1 and c2 == -1:
    raise Exception("c1 & c2 are -1")
else:
    print("ok!")

У вас есть несколько вариантов, чтобы избежать if / elseцеликом (словарь, например, с ключами в виде кортежей (r1, r2, c1, c2) и операциями, которые вы хотите вызывать в качестве значений), но я думаю, что все они будут чистым убытком, если речь идет о читабельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...