嘿,这是我的第一个问题,所以我希望我做对了。
我正在尝试编写一个函数,该函数给出一个整数列表,并且将N作为最大出现次数,然后将返回一个列表,该列表将删除最大出现次数以上的任何整数。例如,如果我输入:
[20,37,20,21] #list of integers
和1 #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))
答案 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]
>>>