Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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 = [1,2,1,3,4,5,4] 最后 A = [1,4] 所以你想要一个函数,它接受一个列表,a,并对该列表进行修改,使之只包含那些最初重复的元素?我假设创建新列表的限制适用于任何新集合。在询问有关算法的问题时,最好尽可能明确要求 这似乎是一个奇怪的要求,在这个算法中没有其他集合,但这是可能的。 一个简单但低效的解决方案是这样处理: 对于每个元素,x 例如,将布尔标志值hasDuplicates设置为false 对于x,y右边

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

范例

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

A = [1,4]

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

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

对于每个元素,x 例如,将布尔标志值hasDuplicates设置为false 对于x,y右边的每个元素 如果y是x的副本,请将其删除并将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]
我“偷”的另一个优雅的选择是: 仅收集出现多次的项目,使用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 find_duplicated_items(data):
    seen = set()
    duplicated = set()

    for x in data:
        if x in seen:
            duplicated.add(x)
        else:
            seen.add(x)

    return duplicated
它接受一个iterable并返回一个集合;您可以将其转换为具有listresults的列表

更新:

这是另一种方法,作为发电机。只是因为:

from collections import Counter

def find_duplicated(iterable, atleast=2):
    counter = Counter()
    yielded = set()

    for item in iterable:
        counter[item] += 1
        if (counter[item] >= atleast) and (item not in yielded):
            yield item
            yielded.add(item)

对于每个元素,如果它出现在前面而不是后面,我会进行检查。如果它不合适,那么要么它不是重复的,要么它是你不想保留的重复的另一个实例。无论哪种情况,我们都不保留它

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
[]

此代码似乎删除了第二个重复项和非重复项,从而生成仅包含唯一重复项的旧列表。我还没有彻底测试过它。请注意,所需时间将按**2的比例缩放,其中N是输入列表的长度

与其他解决方案不同,这里没有构造新的列表,甚至没有用于for循环或列表理解的列表

文件:dup.py

def dups(mylist):
    idx = 0 
    while(idx<len(mylist)):
        delidx = idx+1
        ndeleted = 0
        while delidx < len(mylist):
            if mylist[delidx] == mylist[idx]:
                del mylist[delidx]
                ndeleted += 1
            else:
                delidx += 1
        if ndeleted==0:
            del mylist[idx]
        else:
            idx += 1
    return mylist

您是在谈论删除非重复项还是什么?如果原始列表中有三个4,您希望结果是两个4还是一个?另外,您是否关心顺序?结果会是[4,1]吗?重复:@Nidhi,其中一个答案解决了你的问题吗?如果是这样,请接受:。虽然问题只指定不创建新的“列表”,但我假设要求是不创建任何类型的新集合。此外,似乎需要一种方法,该方法改变现有列表,而不是创建新列表。这正是正确的解决方案,否则我认为!@Oly‘Oil’Sourbut-你能解释一下创建集合和创建不同列表的区别吗?@Nidhi a在《计算机科学》中提到了一些相关的数据结构。A是一种集合,表示一些具有顺序的项,通常可以通过索引访问。例如,A是一个列表,我想要A[4],从A中的0项开始计算的第5项。根据我的经验,“集合”是第二种最常见的集合—它存储数据时没有特定的顺序,也没有重复。@Nidhi在许多编程语言中,类型系统的工作原理是这样的:“集合”是一种类型,它有方法检查其中是否包含项,并且可以对其进行迭代。“列表”是一个集合,它还具有按索引访问项的方法,如果可以更改,则可以在给定索引处插入或删除项。“set”是一个集合,并且具有不包含重复项的属性。通常,这些类型是进一步专门化的-例如“arraylist”或“linkedlist”类型可能专门化“list”类型。@Nidhi,如果您需要订购,列表是很好的;集合对于确保您只存储每件事物中的一件非常有用,或者用于成员资格测试;您可以比检查列表中的内容更有效地检查集合中的内容。还有多集,也称为包,计数器是其中的一个实现;它可以为集合中的每个项目存储计数。。。创建一个列表,但xrange没有。
In [1]: from dup import dups

In [2]: dups([1,1,1,1,1])
Out[2]: [1]

In [3]: dups([1,1,2,1,1])
Out[3]: [1]

In [4]: dups([1,1,2,2,1])
Out[4]: [1, 2]

In [5]: dups([1,1,2,1,2])
Out[5]: [1, 2]

In [6]: dups([1,2,3,1,2])
Out[6]: [1, 2]

In [7]: dups([1,2,1,3,4,5,4])
Out[7]: [1, 4]