我该如何解决此功能?

时间:2020-10-07 10:26:27

标签: python function optimization

嘿,这是我的第一个问题,所以我希望我做对了。

我正在尝试编写一个函数,该函数给出一个整数列表,并且将N作为最大出现次数,然后将返回一个列表,该列表将删除最大出现次数以上的任何整数。例如,如果我输入: [20,37,20,21] #list of integers1 #maximum occurrence。 然后作为输出,我将得到: [20,37,21]因为数字20出现两次,并且最大出现次数是1,所以将其从列表中删除。这是另一个例子: Input: [1,1,3,3,7,2,2,2,2], 3 Output: [1,1,3,3,7,2,2,2]

这是我到目前为止所写的内容,我将如何对其进行优化?我不断收到超时错误。预先非常感谢。

def delete_nth(order,n):
    order = Counter(order)
    for i in order:
        if order[i] > n:
            while order[i] > n:
                order[i] - 1
    return order

print(delete_nth([20,37,20,21], 1))

4 个答案:

答案 0 :(得分:1)

您可以删除开始时建立Counter的内容-只需使用临时词典作为计数器:

def delete_nth(order,n):
    out, counter = [], {}
    for v in order:
        counter.setdefault(v, 0)
        if counter[v] < n:
            out.append(v)
            counter[v] += 1
    return out

print(delete_nth([20,37,20,21], 1))

打印:

[20, 37, 21]

答案 1 :(得分:0)

您写道:

    while order[i] > n:
        order[i] - 1

第二行应该是order[i] -= 1,否则任何进入循环的代码将永远不会离开它。

答案 2 :(得分:0)

我已经将变量重命名为对我来说更有意义的东西:

此版本虽然非常简短且相当有效,但会相邻输出相同的值:

from collections import Counter

def delete_nth(order, n):
    counters = Counter(order)
    output = []
    for value in counters:
        cnt = min(counters[value], n)
        output.extend([value] * cnt)
    return output

print(delete_nth([1,1,2,3,3,2,7,2,2,2,2], 3))
print(delete_nth([20,37,20,21], 1))

打印:

[1, 1, 2, 2, 2, 3, 3, 7]
[20, 37, 21]

此版本将保持原始顺序,但运行速度会稍慢一些:

from collections import Counter

def delete_nth(order, n):
    counters = Counter(order)
    for value in counters:
        counters[value] = min(counters[value], n)
    output = []
    for value in order:
        if counters[value]:
            output.append(value)
            counters[value] -= 1
    return output

print(delete_nth([1,1,2,3,3,2,7,2,2,2,2], 3))
print(delete_nth([20,37,20,21], 1))

打印:

[1, 1, 2, 3, 3, 2, 7, 2]
[20, 37, 21]

答案 3 :(得分:0)

您可以使用带有默认参数collections.defaultdict的谓词在过滤数字列表时保留状态。

def delete_nth(numbers, n):
    from collections import defaultdict
    def predicate(number, seen=defaultdict(int)):
        seen[number] += 1
        return seen[number] <= n
    return list(filter(predicate, numbers))

print(delete_nth([1, 1, 3, 3, 7, 2, 2, 2, 2], 3))
        

输出:

[1, 1, 3, 3, 7, 2, 2, 2]
>>>