Python:删除列表和子列表中的重复元素;并删除完整的子列表,如果重复

时间:2015-03-21 06:14:38

标签: python python-2.7

在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的副本

由于

3 个答案:

答案 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()])