Python编程遇到TLE

【问题描述】
李华想知道冬奥会的奖牌榜。他收集了每个国家参加的运动员的姓名以及每个运动员获得的奖牌。请帮助他在Python的帮助下解决。
【输入表格】
第一行是整数 N,表示国家/地区的数量。
然后对于接下来的 N 行,每行都有多个字符串,用空格分隔。字符串 c 表示国家/地区的名称,字符串n代表该国运动员的姓名。
然后是下一行,一个整数M,表示运动员赢得的奖牌数。
对于以下 M 行,每行都有一个字符串 n 和一个数字 p,以空格分隔。字符串n是运动员的名字,下面的数字p是颁发的奖牌,1是金牌,2是银牌,3是铜牌。
【输出格式】
首先,按从高到低(金牌榜)和产量对所有国家获得的金牌数量进行排序,每行一个国家。
然后,对于换行符(虚线分隔符),输出五个减号 (-)。
从下一行开始,按从高到低(奖牌榜)和产量(每行一个国家/地区)对所有国家/地区赢得的所有奖牌的数量进行排序。
如果金牌(或奖牌总数)的数量相同,则根据国家名称的词典顺序进行排序,并且词典顺序较小的国家排在第一位。
上述输出格式均以 c g s b 为单位,以空格分隔。c 是表示国家/地区名称的字符串;g,s,b是分别代表各国获得的金牌,银牌和铜牌数量的整数。
【样例输入】
6
virtuals miku rin len luka meiko kaito
nightcord kanade mafuyu ena mizuki
wonderlandss tsukasa emu nene rui
vividbs kohane an akito toya
moremorej minori haruka airi shizuku
leon ichika saki honami shiho
12
kanade 1
mizuki 1
ena 1
mizuki 1
len 3
rin 1
meiko 2
emu 1
mafuyu 1
miku 1
len 1
rin 1
【样例输出】
nightcord 5 0 0
virtuals 4 1 1
wonderlandss 1 0 0
leon 0 0 0
moremorej 0 0 0
vividbs 0 0 0


virtuals 4 1 1
nightcord 5 0 0
wonderlandss 1 0 0
leon 0 0 0
moremorej 0 0 0
vividbs 0 0 0
【示例说明】
如预期的那样。请注意,首先输出金牌列表,然后仅输出奖牌总数列表。两个列表都以 c g s b 格式输出。
【数据范围】
1<=n<=100, 10<=m<=30000
问题中的所有字符串的长度均<=15,并且仅是英文字符。确保所有国家和运动员的姓名不重复。每个国家不超过30名运动员。
不能保证金牌,银牌和铜牌的数量相等。某些国家不能有奖牌。有些人可以获得多枚奖牌。
【提示】
请使用Python的数据结构来完成上述问题。
我们还可以使用不等式符号(>,<)直接确定字符串的词典顺序。

本人完成的代码如下:

n = int(input())
candp = [[] for i in range(n)]
candm = [["0",0,0,0,0] for i in range(n)]
for i in range(n):
    temp = input().split()
    ctemp = []
    for j in range(1,len(temp)):
        ctemp.append(temp[j])
    candp[i] = [temp[0], ctemp]
    candm[i][0] = candp[i][0]
m = int(input())
pandm = [[] for i in range(m)]
for i in range(m):
    pandm[i] = input().split()
for i in range(n):
    for j in range(len(candp[i][1])):
        for k in range(m):
            if(pandm[k][0] == candp[i][1][j]):
                if(pandm[k][1] == "1"):
                    candm[i][1] += 1
                elif(pandm[k][1] == "2"):
                    candm[i][2] += 1
                elif(pandm[k][1] == "3"):
                    candm[i][3] += 1
    candm[i][4] = candm[i][1] + candm[i][2] + candm[i][3]
l1 = sorted(candm,key=(lambda x:[-x[1],x[0]]),reverse=False)
for i in range(n):
    print(l1[i][0],end=" ")
    print(l1[i][1],end=" ")
    print(l1[i][2],end=" ")
    print(l1[i][3])
print("-----")
l2 = sorted(candm,key=(lambda x:[-x[4],x[0]]),reverse=False)
for i in range(n):
    print(l2[i][0],end=" ")
    print(l2[i][1],end=" ")
    print(l2[i][2],end=" ")
    print(l2[i][3])

遇到的问题是可以通过评测点的4/10,其余六个点出现TLE超时错误,想了解一下哪里可以优化。

循环太花时间,尤其是嵌套循环
考虑一下用字典结构。题目已经提示,国家和运动员的名字不重复,则可以建两个字典。

N = int(input())
athletes = {}
countries = {}
for i in range(N):
    temp = input().split()
    athletes.update(dict.fromkeys(temp[1:],temp[0]))
    countries[temp[0]]=[0,0,0]
M = int(input())
for i in range(M):
    name, m = input().split()
    countries[athletes[name]][int(m)-1]+=1

output = sorted(countries.items())
opt1 = sorted(output,key=lambda x:x[1][0],reverse=True)
opt2 = sorted(output,key=lambda x:sum(x[1]),reverse=True)
for i,j in opt1:
    print(i,' '.join(map(str,j)))
print('-----')
for i,j in opt2:
    print(i,' '.join(map(str,j)))

输出:

nightcord 5 0 0
virtuals 4 1 1
wonderlandss 1 0 0
leon 0 0 0
moremorej 0 0 0
vividbs 0 0 0
-----
virtuals 4 1 1
nightcord 5 0 0
wonderlandss 1 0 0
leon 0 0 0
moremorej 0 0 0
vividbs 0 0 0