首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google 1级- Minion任务计划

Google 1级- Minion任务计划
EN

Code Review用户
提问于 2020-11-24 14:53:05
回答 1查看 1.2K关注 0票数 3

最近我偶然发现了一篇关于2的文章,并决定自己尝试一下,但从1级开始。描述和代码如下所示。

编写一个名为answer(data, n)的函数,它接受一个小于100个整数和一个数字n的列表,并返回相同的列表,但所有发生的数字都被完全删除了n次。返回的列表应该保留与原始列表相同的顺序--您不想混淆那些精心计划的轮班!例如,如果数据为[5, 10, 15, 10, 7],n为1,则answer(data, n)将返回列表[5, 15, 7],因为10发生了两次,因此从列表中完全删除。约束:除了bz2、crypt、fcntl、mmap、pwd、pyexpat、select、signal、termios、线程、time、unicodedata、zipimport、zlib之外,还支持标准库。测试用例:输入: (int列表) data = [1, 2, 3] (int) n= 0输出: (int列表) []输入: (int list) data = [1, 2, 2, 3, 3, 3, 4, 5, 5] (int) n= 1输出: (int list) [1, 4]输入: (int列表) data = [1, 2, 3] (int) n= 6输出: (int列表) [1, 2, 3]

代码:

代码语言:javascript
复制
def answer(data, n):
    if len(data) > 99:
        exit('List contains more than 100 elements')
    print('data:\n', data) #for error-checking

    count = dict()
    for i in data:
        count.setdefault(i, 0)
        count[i] += 1
    print('count:\n', count) #for error-checking

    for k, v in count.items():
        if v > n:
            for i in range(v):
                data.remove(k)

    return data

我还决定通过使用测试用例和包含随机数的新列表来测试代码。

代码语言:javascript
复制
data1 = [1, 2, 3]
n1 = 0

data2 = [1, 2, 2, 3, 3, 3, 4, 5, 5]
n2 = 1

data3 = [1, 2, 3]
n3 = 6

data4 = [random.randint(1, 15) for i in range(0, 99)]
n4 = 6

ans1 = answer(data1, n1)
print('ans1:\n', ans1, '\n')

ans2 = answer(data2, n2)
print('ans2:\n', ans2, '\n')

ans3 = answer(data3, n3)
print('ans3:\n', ans3, '\n')

ans4 = answer(data4, n4)
print('ans4:\n', ans4, '\n')

输出:

代码语言:javascript
复制
data:
 [1, 2, 3]
count:
 {1: 1, 2: 1, 3: 1}
ans1:
 []

data:
 [1, 2, 2, 3, 3, 3, 4, 5, 5]
count:
 {1: 1, 2: 2, 3: 3, 4: 1, 5: 2}
ans2:
 [1, 4]

data:
 [1, 2, 3]
count:
 {1: 1, 2: 1, 3: 1}
ans3:
 [1, 2, 3]

data:
 [15, 9, 14, 10, 13, 8, 7, 2, 10, 3, 10, 11, 9, 9, 10, 7, 5, 11, 12, 14, 1, 5, 14, 15, 11, 2, 13, 2, 6, 1, 6, 8, 3, 15, 8, 6, 6, 13, 14, 14, 2, 14, 12, 6, 15, 4, 7, 5, 13, 8, 8, 4, 7, 15, 6, 1, 2, 11, 14, 6, 8, 4, 10, 4, 2, 9, 6, 14, 11, 12, 8, 15, 7, 15, 6, 1, 14, 8, 5, 14, 6, 10, 8, 1, 4, 15, 11, 9, 11, 10, 13, 13, 9, 7, 7, 4, 4, 12, 12]
count:
 {15: 8, 9: 6, 14: 10, 10: 7, 13: 6, 8: 9, 7: 7, 2: 6, 3: 2, 11: 7, 5: 4, 12: 5, 1: 5, 6: 10, 4: 7}
ans4:
 [9, 13, 2, 3, 9, 9, 5, 12, 1, 5, 2, 13, 2, 1, 3, 13, 2, 12, 5, 13, 1, 2, 2, 9, 12, 1, 5, 1, 9, 13, 13, 9, 12, 12]

如有任何意见,我们将不胜感激。谢谢:-)

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-11-24 15:31:11

代码语言:javascript
复制
if len(data) > 99:
    exit('List contains more than 100 elements')

我会将该错误消息更改为类似于'List contains a hundred or more elements'的内容。我还可能引发一个ValueError,而不是调用exit。我认为这更适合于用户可能想要捕捉的错误。

您可以通过使用一个setdefault来消除对defaultdict的调用:

代码语言:javascript
复制
from collections import defaultdict

. . .

count = defaultdict(int)  # int is a function that returns 0 when no args are given to it
for i in data:
    count[i] += 1

这里的收益不是很大,但在很多情况下都很方便。

collections.Counter在这里可能也是合适的,但是我只使用过一次,所以我不能给出一个很好的例子。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/252595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档