python函数来减少列表中的逻辑运算符和操作数



我有以下列表。

op=[[3,4,5],'or',[5,6,7],'or',[8,9,10],'and',[9,10,11],'and',[10,11,12]]

此列表包含需要减少的列表和运算符("one_answers"、"或"(。

所有的"and"操作都需要先完成,最后只剩下"or"。如下所示:之后的列表

step 1: [[3,4,5],'or',[5,6,7],'or',[8,9,10],'and',[10,11]]
step 2: [[3,4,5],'or',[5,6,7],'or' ,[10]]
step 3: [[3,4,5],'or',[5,6,7,10]]
step 4: [[3,4,5,6,7,10]]

感谢您的帮助。

谢谢,Sonia

您需要生成两个函数,一个用于'and',另一个用于'or'。以下是我对"或"的建议:

def Or(iter1, iter2):
set1 = set(iter1)
set1.add(iter2)
return list(set1)

对于"one_answers":

def And(iter1, iter2):
lst1 = []
for iterable in iter1:
if iterable in iter2:
lst1.append(iterable)
return lst1

然后,你只需要有某种函数在列表中循环,如果它找到一个"and",它就会在它之前的元素和之后的元素上运行And函数,Or函数也是如此。这看起来像是你的Python作业,所以剩下的我留给你。

这是我的尝试!

这种方法使用递归。如果我按预期理解了问题,打印语句可以用于验证每个步骤。此代码的一些缺点是对pop的两个调用(不优雅(和对循环的双重调用。但根据我对这个问题的理解,它似乎确实起到了作用。

def main(op):
print(op)
if len(op) > 1: 
for i in range(0, len(op)): 
if op[i] == "and":
new_ele = set(op[i-1]).intersection(set(op[i+1]))
op[i-1] = new_ele
op.pop(i)
op.pop(i)
main(op)
for i in range(0, len(op)): 
if op[i] == "or":
new_ele = set(op[i-1]).union(set(op[i+1]))
op[i-1] = new_ele
op.pop(i)
op.pop(i)
print(op)
main(op)
main(op)
print(op)

欢迎提出建议!

我找到了自己的实现方法。感谢大家为此付出的努力。请仔细检查我的解决方案,如果它看起来不错,请告诉我。

算法如下:1.把整个清单分成2份。一个用于操作数(list lovop(,另一个用于运算符(list op(。

2.  
while 'and' in op:
j = op.index(7)
print("index", j)
# print(lovop)
fn(j, lovop)
op.pop(j)
print(lovop)

3.

def fn(ind,lsts):
lsts[ind]=list(set(lsts[ind]) & set(lsts[ind+1]))
lsts.pop(ind+1)
return(lsts)

4.

filters = unionlist(lovop)

5.

def unionlist(lst):
result=set()
for i in lst:
result=result | set(i)
return(list(result))

最新更新