2016-11-12 1 views
0

ファイルを読み込んで複数の項目を追加し、整理した辞書に追加して元の辞書を変更せずに戻す機能を作成しようとしています。複数の項目と値で正しく実行しているかどうかは不明です。機能:ファイルを読み込んで複数の項目を辞書に追加する

戻り値:

{'Leonardo da Vinci': [("Portrait of Isabella d'Este", 1499, 63.0, 46.0, 'chalk', 'France'), ('The Last Supper', 1495, 460.0, 880.0, 'tempera', 'Italy')], 'Pablo Picasso': [('Guernica', 1937, 349.0, 776.0, 'oil paint', 'Spain')]} 

サンプルファイル:私はこれまで持って

file1='''"Artist","Title","Year","Total Height","Total Width","Media","Country" 
"Pablo Picasso","Guernica","1937","349.0","776.0","oil paint","Spain" 
"Leonardo da Vinci","The Last Supper","1495","460.0","880.0","tempera","Italy"''' 

コード:

def add_work (db,artist,title,year,height,width,media,country): 
db = {} 
    with open(filename) as f: 
    for line in f: 
     (title, year, height, width, media, country) = line.split() 
     db[int(artist)] = (title, year, height, width, media, country) 
     for i in d.keys(): 
      if i == artist #If artist in dictionary, then add it to item. 
       db[i].extend 
      elif i == title #If it has the same title as in the database, its a duplicate so return none. 
       return None 
add_work(d1,"Leonardo da Vinci","Portrait of Isabella d'Este", 1499, 63.0,46.0, "chalk", "France") 

制限:

  1. 衛生学的順序:アルファベット順ではなくASCII 照合順序でソートされます。

  2. インポート/コレクション/モジュールがありません。関数、ループ、およびdictメソッドを組み込んだ基本的なもの。

+0

「ASCII照合順」と「アルファベット順」の違いは何ですか?大文字のすべてがすべて小文字の前に来ることを意味しますか?それとも、アルファベット以外の文字に関連していますか?または両方? –

+0

はい@RoryDaultすべての大文字はすべて小文字の前に来ます。アルファベット以外の文字には関係しません –

+0

私はあなたがやろうとしていることを実際には得ていませんが、db [int(artist)] = ... 'はValueErrorを発生させる必要があります。整数ではありません - あなたがしようとしていることを明確にしてください。 csv-Fileからデータを読み込み、アーティストのすべての絵をリストの要素として関連付けていますか? – Maurice

答えて

1

コメントで説明したように、主な問題は、タイトルに基づいてアーティストの絵のリストに新しい絵を配置する場所を把握することです。

実世界の設定でこれらの制約がある理由はないので、これは何らかの宿題に関する質問です。そのため、私はあなたに完全な解決策を与えるつもりはありませんが、正しい方向に指摘してください(少なくとも私は試してみます)。

あなたのアルゴリズムは次のようになります。

  1. キーと値として彼の絵画のリストとして、アーティストの名前の辞書を取得します。各絵は、title,year,height,width,mediaおよびcountryからなる。

  2. を使用すると、そのアーティストの作品のリストを取得countryartistの新しいセット、titleyearheightwidthmediaを考えると。

  3. ここで問題は、新しい絵をどこに追加するか(見つからない場合)です。

  4. 上記のリストのすべての絵をループします。各エントリについて、新しい作品のtitleを、現在のtitleの前に挿入して、以下のcompare_to機能を使用するかどうかを確認します。はい(-1)の場合は挿入します。結果が0の場合、それは既にリストにあり、辞書を返すことになります。結果が1の場合は、リストの次の項目に移動します。それ以上のアイテムがない場合は、最後に追加します。

    def compare_to(string_1, string_2): 
        """ 
        This functions returns -1 if string_1 should be inserted before string_2, 
        0 if the strings are the same (in which case it doesn't matter - or this 
        shouldn't happen) and 1 if string_1 is supposed to be inserted after 
        string_2. 
        """ 
        abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 
        if string_1 == string_2: 
         return 0 
    
        for i in range(min(len(string_1), len(string_2))): 
         if abc.index(string_1[i]) < abc.index(string_2[i]): 
          return -1 
    
        # The strings are not the same, the shorter one should come first 
        if len(string_2) > len(string_1): 
         return -1 
    
        return 1 
    

    私はあなたが、比較して数字を扱うabc変数に追加して自由に感じるしたいのですが方法がわからない:

これはcompare_to機能です。

+0

詳細な説明をありがとうございます。私は質問がある、これは任意の主要な位置に適用されるので、辞書と国(例えば)の名前を受け入れて、その国が与えられた国の議論と一致する辞書からのすべての作品で新しい辞書を作成/返すようにすることができますか? –

+0

ようこそ。はい、可能ですが、あなたの辞書のすべてのキーをループして、リストの値を[list comprehension]でフィルタリングすることができます(https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions )。しかしこれは別の質問であり、コメントであなたに説明できるものは何もありません;-) – Maurice

+0

問題なし、私はそれが最終的にはうまくいくように管理しました。 –

関連する問題