Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除python中的重复元素_Python - Fatal编程技术网

删除python中的重复元素

删除python中的重复元素,python,Python,例如,对于给定列表: [ 'A', [ 'B', ['D','C'], ['C','D'] ], ['C','D'], ['E','F'], ['F','E'], [ ['not','M'], 'N', ['not','M'] ] ] 我想删除其中的重复元素,上面列表的结果应该是: [ 'A', [ 'B

例如,对于给定列表:

[
    'A',
    [
        'B',
        ['D','C'],
        ['C','D']
    ],
    ['C','D'],
    ['E','F'],
    ['F','E'],
    [
        ['not','M'],
        'N',
        ['not','M']
    ]
]
我想删除其中的重复元素,上面列表的结果应该是:

[
    'A',
    [
        'B',
        ['C','D']
    ],
    ['C','D'],
    ['E','F'],
    [
        ['not','M'],
        'N'
    ]
]
它有两条规则:
['not','A']
表示~A,可以将其视为一个元素。 如果值相同但顺序不一样,我们认为它是相同的。因此<代码> [’C’,''')/代码>与<代码> [d','c' ] < /代码>相同。
有人能帮我用python编写这个函数来实现这个要求吗?

总的来说,我同意克劳斯D.的评论。但是我觉得这个问题很有趣,因为我能想到的最简单的方法是使用列表->元组->集合,当你想删除元素时,这会变得很有趣。它还会导致您丢失原始输入列表的顺序(如Adam Smith所述)

因此,考虑到所有这些,请考虑:

import itertools

def _reduce(lst):
    if not isinstance(lst, list): return lst

    seen = []
    for x in lst:
        if not any(list(perm) in seen for perm in itertools.permutations(x)):
            seen.append(_reduce(x))
    return seen
您可以通过以下方式运行:

lst = [
    'A',
    [
        'B',
        ['D','C'],
        ['C','D']
    ],
    ['C','D'],
    ['E','F'],
    ['F','E'],
    [
        ['not','M'],
        'N',
        ['not','M']
    ]
]
print _reduce(lst)
哪些产出:

[
    'A', 
    [
        'B', 
        ['D', 'C']
    ], 
    ['C', 'D'], 
    ['E', 'F'], 
    [
        ['not', 'M'], 
        'N'
    ]
]
注意,这保留了列表元素的输入顺序。还请注意,正因为如此,此输出与预期输出略有不同(
['D','C']
被保留,而
['C','D']
被丢弃)


<强> >编辑> <强> >“代码>迭代器.PyTrimultSo()/<代码>将不足够,因为您似乎需要一些递归函数,这些函数也将考虑子元素的排列。那么:

import itertools

def _permutations(x):
    if not isinstance(x, list): return x

    perms = []
    for prod in itertools.product(*[_permutations(elem) for elem in x]):
        for perm in itertools.permutations(prod):
            perms.append(list(perm))

    return perms

def _reduce(lst):
    if not isinstance(lst, list): return lst

    seen = []
    for x in lst:
        if not any(list(perm) in seen for perm in _permutations(x)):
            seen.append(_reduce(x))
    return seen

def lexsort(x): return sorted(str(e) for e in _permutations(x))

arrs =  [
    ['B',['C','D']],
    [['D','C'],'B'],
]

print _reduce(arrs)
产出:

[['B', ['C', 'D']]]

因此,没有代码编写服务。您提供代码,其他用户将帮助您解决问题。您应该能够将每个
列表
转换为
集合
,以获得所需的最终结果。只是在数据中递归。请注意,这会删除订购。您好,谢谢您的代码。它在一些正常情况下工作得很好。但是考虑这一情况:[[ b ],['c',''] ],[[d],'c'],'b'],它仍然返回[[ b′,[c],''] ],[[d],'c'],'b']。但实际上这两个元素是相同的。如何解决这类案件?