查找唯一数字的代码缓慢且效率低下?

时间:2019-05-21 16:00:38

标签: python python-3.x

我最近正在处理代码战中的代码问题,以在列表中找到唯一编号。我的代码可以运行,但是效率非常低。我不知道为什么会这样。下面是我发布的代码:

我认为问题可能出在我每次(可能)每次都复制列表时。

def find_uniq(arr):
    equal_check = 0
    for i in arr:
        arr_new = arr.copy()
        arr_new.remove(i)
        if i not in arr_new:
            equal_check = i
    return equal_check

1 个答案:

答案 0 :(得分:2)

使用collections.Counter,获得计数为1的数字:

from collections import Counter 

def find_uniq(arr):
    c = Counter(arr)
    return [number for number,count in c.most_common() if count == 1]


print(find_uniq( [1,2,3,4,2,3,4,5,6,4,5,6,7,8,9])) # [1, 7, 8, 9]

这大约需要O(2 * n),所以O(n)为2是常数。


collection.defaultdict(具有int),获得计数为1的那些:

# defaultdict
from collections import Counter , defaultdict

def find_uniq(arr):
    c = defaultdict(int)
    for a in arr:
        c[a] += 1
    return [number for number,count in c.items() if count == 1]


print(find_uniq( [1,2,3,4,2,3,4,5,6,4,5,6,7,8,9])) # [1, 7, 8, 9]

这大约需要O(2 * n),所以O(n)为2是常数–由于实现内部的C优化,它比Counter快一点(请参见f {e。Surprising results with Python timeit: Counter() vs defaultdict() vs dict())。


normal dicts并设置默认值或测试/添加,得到计数为1的数字:

# normal dict - setdefault
def find_uniq(arr):
    c = dict()
    for a in arr:
        c.setdefault(a,0)
        c[a] += 1
    return [number for number,count in c.items() if count == 1]


print(find_uniq( [1,2,3,4,2,3,4,5,6,4,5,6,7,8,9])) # [1, 7, 8, 9]

# normal dict - test and add 
def find_uniq(arr):
    c = dict()
    for a in arr:
        if a in c:
            c[a] += 1
        else:
            c[a] = 1

    return [number for number,count in c.items() if count == 1]


print(find_uniq( [1,2,3,4,2,3,4,5,6,4,5,6,7,8,9])) # [1, 7, 8, 9]

Setdefault每次都会创建一个默认值-比Counter或defaultdict慢,而使用test / add则更快。


itertools.groupby(需要 sorted 列表!),获得计数为1的那些:

from itertools import groupby

def find_uniq(arr):
    return [k for (k,p) in groupby(sorted(arr)) if len(list(p)) == 1]

print(find_uniq( [1,2,3,4,2,3,4,5,6,4,5,6,7,8,9])) # [1, 7, 8, 9]

groupby需要一个已排序的列表,单独的列表排序是O(n * log n),组合起来比其他方法要慢。