bes*_*sil 1 python dictionary min built-in
我正在进行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
Run Code Online (Sandbox Code Playgroud)
vals是一个元组列表(rank,male_name,female_name),我想将每个名字(男性和女性)存储在字典"d"中,名称为key,排名为value.如果有重复,我想保持较低的等级值.
我注意到"Adrian"这个名字在集合中出现了两次,第一次是男性名字,排名第94位,第二次是女性,排名603,我想要两个值中较小的一个.
因此,第一次'Adrian'匹配时,它存储在排名为94(正确)的字典中.当它第二次匹配时,执行流程正确地进入第二个if的第二个分支,但结果为603,即使min(94,603)= 94.结果是:
min( 603, 94) = 603
1990
Adrian 603
Anton 603
Ariel 94
Run Code Online (Sandbox Code Playgroud)
我不明白这个bug在哪里.通过解释器,min(94,603)= 94,如预期的那样.我错过了什么?
感谢帮助
PS:我也试过min(n,d [f]),它是没有列表的相同函数,但结果总是603
您正在比较字符串,而不是数字:
>>> min('603', '94')
'603'
Run Code Online (Sandbox Code Playgroud)
从字面上看,先前'6'排序'9'.正则表达式适用于字符串,即使数字匹配,返回的匹配也是字符串.使用int()将您的字符串转换为整数:
vals = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f)
for n, m, f in vals:
n = int(n)
# ...
Run Code Online (Sandbox Code Playgroud)
在尝试调试Python代码时,请使用repr()而不是str()检测类型问题; 如果你使用过repr()你会看到'94'将被打印而不是94(所以用引号来表示一个字符串).
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |