2017-09-23 10 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' 

は私の関数のコードであり、私は1へ3つの辞書に参加しようとしたか:あなたは

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''を返します。これまでのところ、問題はあなたのコードではなく、エラー処理の欠如です。 'None'に対してメソッドを呼び出すことはできません。 –

+0

しかし、3つの関数を完全に打ち込むと、Noneを返しません。 – Tokaalmighty

答えて

1

f1,0の元の定義は表示されません。とf3が、私はそれのようなものになります疑いがある:何が起こっている

f1 = open(...) 

は、その後、繰り返しが最後の中断したところから始まるファイルから読み込むことです。ファイル全体を読み取った場合(bsを解析するなど)、最後に表示され、その後の読み取りが空に戻ります。 bsは空のファイルで適切なクラスのテーブルを今見つけられないので、Noneを返します。

これを修正するには、

f1.seek(0) 

あなたはそれをもう一度使用する前に呼び出すことにより、バックスタートに内部ポインタファイルをリセットすることができます。または変数の最初のget_dict呼び出しの結果をキャプチャして、作業の重複を避けることができます。

+0

f1、f2、f3の定義については正しいと思いますが、返された値を変数に代入して実際に各ディクショナリを印刷できるようにしました。しかし、アンパック方法を使って辞書に加わっても、3つの辞書のうちの1つだけを戻すという問題は解決していないようです。 – Tokaalmighty

+0

私はあなたが与えた手がかりに基づいてそれを理解しました!一部のオンラインコースの割り当てに関連しているため、コードの一部を削除しました。質問と回答はまだ関連しているはずです。 – Tokaalmighty

+0

辞書に参加する際の問題は、よく辞書に加わることです。それらのすべてが同じハードコーディングされたキーを持っているので、 '勝ち'に1つの値を選ぶでしょう。マージされたdictの各値がコレクションの 'defaultdict'を使ってコンポーネントのdictsからの値のリストであるように、あなたは*設定することができます。そして各dictの各キーを繰り返し処理します。しかし、そのような種類のデータ構造は、深くネストされた単一キー・ディクテーションのように、非常に奇妙です。あなたがやりたいことに応じて、おそらく別のデータ構造が理にかなっています。 – lvc

0

だけではできません。これを行う?

f1はDIC 1

f2はDIC 2

f3はDICである3

これは次いで

A1

としてDIC f1とf2をマージ再びA1よう

をA1およびF3をマージ
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

しかし、それは**構文を使用したOPの方法は完全に問題なく、問題の原因ではありません( 'get_dict' )。 – lvc

関連する問題