如何在不创建单独列表的情况下查找列表中的重复项?

2024-04-24 21:57:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在不创建任何其他列表的情况下查找列表中的重复项?你知道吗

示例

A = [1,2,1,3,4,5,4]

最后

A = [1,4]

Tags: 示例列表情况
3条回答

所以你想要一个函数,它接受一个列表,a,并对该列表进行变异,使之只包含那些最初被复制的元素?我假设创建新列表的限制适用于任何新集合。在询问有关算法的问题时,最好尽可能明确要求。你知道吗

这似乎是一个奇怪的要求,没有其他集合在这个算法中,但这是可能的。 一个简单但低效的解决方案是这样:

  • 对于每个元素,x
    • 设置布尔标志值,例如hasDuplicatesfalse
    • 对于x的每个元素,y
      • 如果yx的副本,请删除它并将hasDuplicates设置为true
    • 如果hasDuplicates为false,则删除x

如果不创建另一个集合的限制可以放宽,或者如果算法的结果可以是一个新的列表而不是旧的列表被修改,那么您将找到更有效的方法来完成这一点。你知道吗

您可以使用^{}仅获取唯一值,然后从原始列表中逐个删除这些值,以便只保留重复的值:

a = [1,2,1,3,4,5,4]
s = list(set(a))
for x in s:
    a.remove(x)
print a # [1, 4]

我从Ritesh Kumar偷来的另一个优雅的选择是:
仅收集出现多次的项,使用set删除dup,并使用list将其包装以返回列表:

a = [1,2,1,3,4,5,4]
print list(set([x for x in a if a.count(x) > 1])) # [1, 4]

我会去检查,对于每个元素,如果它出现在它之前,而不是之后。如果它不适合,那么要么它不是一个复制品,要么它是你不想保留的另一个复制品。不管是哪种情况,我们都不保留它。你知道吗

def simplify(a_list):
    for i in range(len(a_list) - 1, -1, -1):
        value = a_list[i]
        if not value in a_list[:i] or value in a_list[i+1:]:
            del a_list[i]

但不确定使用切片是否符合您的要求。你知道吗


用法:

>>> A = [1,2,1,3,4,5,4]
>>> simplify(A)
>>> A
[1, 4]
>>> A = [1,1,1,1,1,2,2,2,2]
>>> simplify(A)
>>> A
[1, 2]
>>> A = [1,1,1,1,1]
>>> simplify(A)
>>> A
[1]
>>> A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> simplify(A)
>>> A
[]

相关问题 更多 >