我正在做 Google Python 练习并且不理解 min() 内置函数的行为,这似乎不会产生预期的结果。练习是“babynames”,我正在使用“baby1990.html”文件(https://developers.google.com/edu/python/exercises/baby-names)测试代码
def extract_names(filename):
f = open(filename, 'r').read()
res = []
d = {}
match = re.search(r'<h3(.*?)in (\d+)</h3>', f)
if match:
res.append(match.group(2))
vals = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f)
for n, m, f in vals:
if m=='Adrian' or f=='Adrian':
if m not in d:
d[m] = n
else:
d[m] = min(n, d[m])
if f not in d:
d[f] = n
else:
print "min( "+str(n)+", "+str(d[f])+") = "+str( min(n, d[f]) )
d[f] = min( [n, d[f]] )
for name,rank in sorted(d.items()):
res.append(name+" "+str(rank))
return res
vals 是一个元组列表(rank、male_name、female_name),我想将每个名称(男性和女性)存储在字典“d”中,名称为键,排名为值。如果有重复,我想保留较低的排名值。
我注意到“Adrian”这个名字在集合中出现了两次,第一次是男性名字,排名 94,第二次是女性名字,排名 603,我想要两个值中较小的一个。
因此,第一次匹配 'Adrian' 时,它被存储在排名为 94 的字典中(正确)。第二次匹配时,执行流程正确进入了第二个if的第二个分支,但是结果变成了603,即使min(94, 603) = 94。所以结果是:
min( 603, 94) = 603
1990
Adrian 603
Anton 603
Ariel 94
我不明白错误在哪里。正如预期的那样,通过解释器,min(94, 603) = 94。我错过了什么?
感谢帮助
PS:我也试过 min(n, d[f] ) 那是没有列表的相同函数,但结果总是 603