删除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']。但实际上这两个元素是相同的。如何解决这类案件?