返回列表中的重复项

时间:2015-07-15 15:08:48

标签: python list count

此函数采用未排序值的整数列表(您的函数不能修改)并返回该第一个列表中所有重复项的排序列表。例如,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

2 个答案:

答案 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

对大多数人来说更有意义,而且它也有效。)