簡體   English   中英

Python 2.7-最小內置函數無法按預期工作

[英]Python 2.7 - min built-in function not working as expected

我正在做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是元組的列表(等級,男性名稱,女性名稱),我想將每個名稱(男性和女性)存儲在字典“ d”中,名稱作為鍵,等級作為值。 如果有重復,我想保留較低的等級值。

我注意到“ Adrian”這個名稱在集合中出現了兩次,第一次是男性,排名為94,第二次是女性,排名為603,我希望這兩個值中的較小者。

因此,第一次匹配“ Adrian”時,它以正確的等級存儲在字典中,排名為94。 如果第二次匹配,則執行流正確地進入if的第二個分支,但是即使min(94,603)= 94,結果也變成603。所以結果是:

min( 603, 94) = 603
1990
Adrian 603
Anton 603
Ariel 94

我不知道錯誤在哪里。 通過解釋器,min(94,603)= 94,如預期的那樣。 我想念什么?

感謝幫助

PS:我也嘗試過min(n,d [f]),它是沒有列表的相同函數,但結果始終是603

您正在比較字符串, 而不是數字:

>>> min('603', '94')
'603'

在字典上, '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)
    # ...

嘗試調試Python代碼時,請使用repr()而不是str()來檢測類型問題。 如果您使用repr()您會看到將打印'94'而不是94 (因此用引號表示字符串)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM