优化Python脚本

时间:2017-07-25 10:28:34

标签: python python-3.x

我一直在尝试用Python完成以下任务:

http://codeforces.com/problemset/problem/4/C

我为它创建了一个简单的脚本,如下所示,但它为第7次测试返回运行时错误。我相信这可能是因为代码花了太长时间,所以我需要帮助来优化它。我查看了map和filter命令并尝试实现它们,但没有成功。

a=int(input())
entered_usernames=[]
n=0
while n<a:
    y=input()
    entered_usernames.append(y)
    n+=1

valid_usernames=[]
for i in entered_usernames:
    if i not in valid_usernames:
        valid_usernames.append(i)
        print('OK')
    else:
        count=1
        while i+str(count) in valid_usernames:
            count+=1
        valid_usernames.append(i+str(count))
        print(i+str(count))

3 个答案:

答案 0 :(得分:2)

您可以尝试将valid_usernames更改为set而不是list

对于列表list_a,操作x in list_a需要(平均)线性时间

对于一组set_a操作x in set_a需要(平均)恒定时间

(来源:https://wiki.python.org/moin/TimeComplexity

这个简单的改变可以改善运行时间。

这个片段可能会让我觉得非常缓慢:

while i+str(count) in valid_usernames:
        count+=1

但是,如果要改进这一点,则需要考虑使用完全不同的数据结构。

答案 1 :(得分:2)

为什么不对计数器使用查找dict并在O(N)时间内解决此问题?

total = int(input())  # get the first input (total usernames)
database = {}  # our 'database' / lookup dict
candidates = [input() for _ in range(total)]  # pick usernames from the input
for candidate in candidates:  # loop through each candidate
    if candidate in database:  # already used, print with a counter
        print(candidate + str(database[candidate]))
        database[candidate] += 1  # increase the counter
    else:  # the candidate doesn't exist in the 'database'...
        print("OK")
        database[candidate] = 1  # initialize counter for the next time

答案 2 :(得分:0)

你为什么不试试

valid_usernames.append(i+str(valid_usernames.count(i)))
print(i+str(valid_usernames.count(i))