2017-01-20 8 views
0

私は辞書のリストを持っています。リストにリストがない場合は、そのリストに辞書を追加したいと思います。リストにユニーク辞書を追加する

listofdictionary= [] 
newdictionary = {'Id': '001', 'Name': 'book title'} 

for mydict in self.listofdictionary: 
    if mydict['Id'] == newdictionary['Id']: 
     print("Match for {0}".format(neworder['Title'])) 
    elif mydict['Id'] != newdictionary['Id']: 
     self.listofdictionary.append(newdictionary) 

しかし、私は2番目を追加する場合は、第3及び第4の辞書エントリ私は

for mydict in self.listofdictionary: 
    print("{0}".format(mydict)) 

{'Id': '001', 'Title': 'book title'} 
{'Id': '002', 'Title': 'book title'} 
{'Id': '002', 'Title': 'book title'} 
{'Id': '003', 'Title': 'book title'} 
{'Id': '003', 'Title': 'book title'} 
{'Id': '003', 'Title': 'book title'} 
{'Id': '004', 'Title': 'book title'} 
{'Id': '004', 'Title': 'book title'} 
{'Id': '004', 'Title': 'book title'} 
{'Id': '004', 'Title': 'book title'} 

おかげで、

ジョン...で終わります。

+2

あなたは 'id'だけを比較するので、ディクショナリの辞書を作成して、それぞれの辞書にIDをマッピングしてみてはいかがですか?そして、すべてのdictsがIDと名前だけを持っているならば、idとkeyを値として使って、ちょうど1つのdictを使うこともできます。 –

+0

おそらく8-10のフィールドがディクテーションにあり、リストには数千ものフィールドがある可能性があります。時間の経過とともに、ディクテーションの他の部分を比較したいと思います。著者、主題などのように。 – John

+0

セットを作成します。リストに辞書を追加するたびに、 '' 'ID'''をセットに追加します。辞書チェックを追加して '' 'ID''がセットに含まれているかどうかを調べる前に、@tobias_kが最良の方法を述べました。 – wwii

答えて

2

あなたのコードはリスト内のすべての辞書をチェックし、についてはIdの辞書の各に新しい辞書を追加します。

リストに既に異なるIdの4つの辞書がある場合、新しい辞書が4回追加されます。

代わりに、それは実際に辞書の辞書た場合、容易になりthings'd

if all(olddict['Id'] != newdictionary['Id'] for olddict in self.listofdictionary): 
    self.listofdictionary.append(newdictionary) 

または

if newdictionary['Id'] not in [d['Id'] for d in self.listofdictionary]: 
    self.listofdictionary.append(newdictionary) 

の操作を行います。

if newdictionary['Id'] not in self.dictofdictionaries: 
    self.dictofdictionaries[newdictionary['Id']] = newdictionary 

、または複数のフィールドを持つへ一意性チェック:

key = tuple(newdictionary[k] for k in ('Id', 'author', 'subject', 'etc')) 

if key not in self.dictofdictionaries: 
    self.dictofdictionaries[key] = newdictionary 
+0

私はまた、コンテンツが挿入される順番が重要でない場合、 'set'が行く方法であると付け加えます。メンバシップテストは自動的に実行され、項目が存在しない場合にのみ挿入されます。データOPストアからは、これが当てはまると思います。 –

+0

辞書の辞典に感謝します。さて、この辞書をフラットラインとして表示するには良い方法がありますか? – John

+0

json.dumps(dictofdictionaries)?または、あなたが持っているようにリストを取得するには(dictofdictionaries.values())をリストします。 – RemcoGerlich

関連する問題