2017-09-23 42 views
0

我想創建一個函數,返回一個字典並使用它3次,然後將返回的字典加入到1中。然後將該字典作爲值分配給另一個字典。但是print(all_dict)只返回1個字典。如果我嘗試打印(get_dict(f1)),我會得到下面的Traceback。如果不是每次調用同一個函數3次,我都用每個函數中的相同命令分別定義每個函數,我可以得到我想要的。但我希望找到更簡潔的方式來編寫代碼。Python函數使用3次,但只返回一次

您可以找到表這裏的HTML:https://github.com/Tokaalmighty/topmover_table_html/blob/master/html

Traceback (most recent call last): 
    File "week4_1.py", line 55, in <module> 
    print(get_dict(f1)) 
    File "week4_1.py", line 23, in get_dict 
    bold=topmovers.find_all('b') 
AttributeError: 'NoneType' object has no attribute 'find_all' 

這裏是我的函數的代碼,我如何想加入3個字典爲1:

def get_dict(f1): 

    soup=bs(f1,'html.parser') 
    topmovers=soup.find('table'{'class':'topmovers'}) 
    bold=topmovers.find_all('b') 
    … 
    … 
    return final 

all_dict={} 
result = {**get_dict(f1), **get_dict(f2), **get_dict(f3)} 
all_dict['result']=result 
print(all_dict) 
print(get_dict(f1)) 
+0

你的錯誤是由'topmovers = soup.find('table',{'class':'topmovers'})'返回'None'造成的。到目前爲止,這個問題不在你的代碼中,而是你缺乏錯誤處理。您無法針對「無」調用方法。 –

+0

但它不會返回一個無,如果我完全鍵入3個函數.. – Tokaalmighty

回答

1

您不顯示您的原始定義f1,f2f3,但我懷疑它看起來像:

f1 = open(...) 

這是怎麼回事,那麼,就是重複讀取文件從其中最後一個離開的開始。如果你已經閱讀完整個文件(比如通過獲取bs來解析它),那將會在最後讀取,而後續的讀取將回到空白。 bs現在無法在空文件中找到適當類別的表格,因此它會返回None

爲了解決這個問題,你可以通過調用

f1.seek(0) 

在你使用它的第二次重置文件內部指針回到起點;或者您可以通過在變量中捕獲第一個get_dict調用的結果來避免重複工作。

+0

您對f1,f2和f3的定義是正確的,並將返回的值分配給確實可以打印每個字典的變量。但是,即使在使用解包方法來加入詞典之後,它似乎也沒有解決只返回3個詞典中的一個的問題。 – Tokaalmighty

+0

我已經根據你給出的線索算出來了!我刪除了部分代碼,因爲它與一些在線課程分配有關。問題和答案應該仍然相關。 – Tokaalmighty

+0

加入字典的問題是,加入字典。由於它們都具有相同的硬編碼密鑰,它將選擇一個值來「贏」。你可以設置它,因此合併的字典中的每個值都是來自組件字典的列表或一組值,通過使用來自集合的'defaultdict',並遍歷每個字典中的每個鍵。但是這種數據結構非常奇怪,就像你深深嵌套的單鍵字典一樣。根據你想要做什麼,不同的數據結構可能更有意義。 – lvc

0

你能不只是做這個?

f1是DIC 1

f2是DIC 2

f3是DIC 3

然後合併DIC f1和f2爲A1

然後合併A1和f3作爲A1同樣

def MergeDic(f1, f2, f3): 
    A1 = f1.copy() 
    A1.update(f2) 
    A1.update(f3) 
    return A1 
+0

不需要'A2' ..只需再次更新A1並返回它。或者甚至更好,使用'collections.ChainMap'。 – lvc

+0

完成..謝謝 - 不知道什麼collections.ChainMap是否沒有使用 – Kieron

+1

但是,那說,使用**語法的OPs方式是完全正確的,而不是他們的問題的來源(這發生在'get_dict'內部)。 – lvc