此函数采用未排序值的整数列表(您的函数不能修改)并返回该第一个列表中所有重复项的排序列表。例如,duplicates([1, 3, 5, 7, 9, 5, 3, 5, 3])
将返回[3, 5]
。如果没有重复项,则返回一个空列表。
以下是我目前的代码,但不起作用。我该如何解决这个问题?
def FindDuplicates(in_list):
unique = set(in_list)
for each in unique:
count = in_list.count(each)
if count > 1:
print count
return True
print []
return False
答案 0 :(得分:1)
为了在没有Counter / dict的情况下执行此操作,您可以修改当前代码以将重复值保存在新列表中,如下所示:
def FindDuplicates(in_list):
duplicates = []
unique = set(in_list)
for each in unique:
count = in_list.count(each)
if count > 1:
duplicates.append(each)
print duplicates
将输出:
>>> FindDuplicates(lst)
[3, 5]
如果您需要对结果进行排序,请在结尾处使用sorted(duplicates)
调用,以便按照其值对结果进行排序。
您还可以使用collections.Counter
和列表理解来解决此问题(即在列表中查找重复项),如下所示:
>>> from collections import Counter
>>> lst = [1, 3, 5, 7, 9, 5, 3, 5, 3]
>>> def duplicates(list_of_numbers):
... counter = Counter(list_of_numbers)
... return [y for y in counter if counter[y] > 1]
...
>>> duplicates(lst)
[3, 5]
上述解决方案假设列表中的元素是可清除的。
答案 1 :(得分:1)
稍快一点,在O(nlogn)最坏情况下
def FindDuplicates(in_list):
unique = set()
duplicates = set()
for i in in_list:
if i in unique: #hey, I've seen you before
duplicates.add(i)
else:
unique.add(i)
return sorted(duplicates)
#It's this call to sorted that makes it O(nlogn)
#without it, it'd be O(n)
同样是男人,你不能阻止我使用柜台!"变种。 O(nlogn)。
def FindDuplicates(in_list):
d = {}
for i in in_list:
if i in d:
d[i] += 1
else:
d[i] = 1
return sorted(i for i,j in d.items() if j > 1)
#python2 use d.iteritems() not d.items()
(我想
if i not in d:
d[i] = 1
else:
d[i] += 1
对大多数人来说更有意义,而且它也有效。)