在python 2.7中是否有任何函数或方法可以递归地实现这一点?
Input : ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P']]
Output : ['and', ['or', 'P', '-R'], ['or', '-Q', '-R', 'P']]
删除重复的' P'在sublist1中作为重复
Input : ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P'], ['or', 'P', '-R', 'P']]
Output : ['and', ['or', 'P', '-R'], ['or', '-Q', '-R', 'P']]
删除重复的' P'在sublist1中重复,并删除sublist3作为sublist1的副本
由于
答案 0 :(得分:2)
您可以使用set
和生成器表达式将内部列表转换为不可变对象的元组,然后在其上应用set
:
>>> a=['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P'], ['or', 'P', '-R', 'P']]
>>> set(tuple(p) if isinstance(p,set) else p for p in (set(i) if isinstance(i,list) or isinstance(i,tuple) else i for i in a))
set(['and', ('P', 'or', '-R'), ('P', '-Q', 'or', '-R')])
答案 1 :(得分:2)
我认为您必须创建自定义remove duplicate
函数以保留子列表的顺序。请尝试:
def rem_dup(lis):
y, s = [], set()
for t in lis:
w = tuple(sorted(t)) if isinstance(t, list) else t
if not w in s:
y.append(t)
s.add(w)
return y
inp = ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P'], ['or', 'P', '-R', 'P']]
out = [rem_dup(i) if isinstance(i, list) else i for i in rem_dup(inp)]
>>>out
['and', ['or', 'P', '-R'], ['or', '-Q', '-R', 'P']]
答案 2 :(得分:1)
您可以使用OrderedDict
删除重复并保留订单:
from collections import OrderedDict
inp= ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P']]
out = [OrderedDict.fromkeys(sub).keys() if isinstance(sub, list) else sub for sub in inp]
print(out)
['and', ['or', 'P', '-R'], ['or', '-Q', '-R', 'P']]
要删除重复的子列表,请将列表转换为元组并再次使用fromkeys:
inp = ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P'], ['or', 'P', '-R', 'P']]
out = OrderedDict.fromkeys(tuple(OrderedDict.fromkeys(sub).keys()) if isinstance(sub, list) else sub for sub in inp)
print(out.keys())
['and', ('or', 'P', '-R'), ('or', '-Q', '-R', 'P')]
如果你想再次使用列表,请使用iterkeys进行python2:
out = OrderedDict.fromkeys(tuple(OrderedDict.fromkeys(sub).iterkeys()) if isinstance(sub, list) else sub for sub in inp)
print([list(ele) if isinstance(ele, tuple) else ele for ele in out.iterkeys()])