簡體   English   中英

在python中檢查(“ and”,“ or”)優先級的簡單方法

[英]Easy way to check precedence of ( “and”, “or”) in python

我有一個像這樣的python列表

[True, "and", False, "or", False, "or", True ....]

如何操作它們並有效地找到布爾值(True和False或False或True ...)?

我知道並且比或具有更高的優先級。 因此,我知道了我們如何打破每個列表的和從每個列表計算出的布爾值的布爾值的方式。

我想知道還有更簡單的方法嗎?

if my_list = [True, "and", False, "or", False, "or", True ] this will output
True as (True and False) or False or True = False or False or True which is True. 

if my_list = [True, "and", True, "or", False, "or", False ] this will output 
True as (True and True) or False or False = True or False or False which is True

if my_list = [False, "or", False, "and", False, "and", True ] = False or False which is False

運算符優先級的一種方法是通過調車場算法 ,該算法需要堆棧:

def evaluate(e):
    ops = {'and': 1, 'or': 0} 
    op_stack = []
    output = []
    for i in e:
        if i in ops:
            while op_stack and ops[op_stack[-1]] > ops[i]:
                output.append(op_stack.pop())
            op_stack.append(i)
        else:
            output.append(i)
    op_stack.reverse()
    output.extend(op_stack)

    stack = []
    for i in output:
        #print(stack, i)
        if i in ops:
            a, b = stack.pop(), stack.pop()
            if i == 'and':
                i = a and b
            else:
                i = a or b
        stack.append(i)
    return stack[0]

>>> evaluate([True, "and", False, "or", False, "or", True])
True
>>> evaluate([True, 'or', True, 'and', False])
True

進行運算符優先級的另一種方法是遞歸優先級爬升算法:

ops = {'and': 1, 'or': 0}

def tokenizer(l):
    for i in l:
        o = yield i
        while o:
            yield None
            o = yield o

def evaluate(token, prec=0):
    lhs = next(token)

    while True:
        op = next(token, None)
        if op is None or ops[op] < prec:
            if op: token.send(op)
            break

        rhs = evaluate(token, ops[op]+1)
        #print(lhs, op, rhs)
        lhs = lhs and rhs if op == 'and' else lhs or rhs
    return lhs

>>> evaluate(tokenizer([True, 'or', True, 'and', False]))
True
>>> evaluate(tokenizer([True, "and", False, "or", False, "or", False, "or",
...                     True, "and", False, "or", False, "or", False]))
False

與印刷品:

>>> evaluate(tokenizer([True, "and", False, "or", False, "or", False, "or",
...                     True, "and", False, "or", False, "or", False]))
True and False
False or False
False or False
True and False
False or False
False or False
False or False
False

IIUC您可以使用mapisinstance

l = [True, "and", False, "or", False, "or", True]
res = list(map(lambda x: isinstance(x, bool), l))

print(res)
[True, False, True, False, True, False, True]

不知道這是否會更快,但是:

l = [True, "and", False, "or", False, "or", False, "or", True, "and", False, "or", False, "or", False]
eval(' '.join([ str(z) for z in l]))

結果:

False

如果我正確理解,這應該是最簡單(不太優雅)的解決方案

expression = [True, "and", False, "or", False, "or", True]


def eval_expr( value1, operator, value2):
    if operator == 'and':
        return value1 and value2

    else:
        return value1 or value2


result = None

while len(expression) != 1:
    v1 = expression.pop()
    op =  expression.pop()
    v2 = expression.pop()
    partial_result = eval_expr(v1, op, v2)
    expression.insert(0, partial_result)
    result = partial_result

print result

@Iliyan的答案是正確的。 沒有我那么客氣。

我想出了一個辦法。

my_list = [True,“和”,False,“或”,False,“ or”,True]

  1. 我創建了一個文件temp.py
  2. 以temp.py分隔的順序空間輸入my_list列表中的所有值
  3. 執行的temp.py
  4. 刪除的temp.py

有點黑客;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM