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]