![](/img/trans.png)
[英]Is there an easy way to check if an object is JSON serializable in python?
[英]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您可以使用map
, isinstance
:
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]
有點黑客;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.