2011-06-25 5 views
2

は、私は、辞書のリストを持っている:dictsのリストでは、1つのキー/値に基づいてdictを一致させますか? Pythonで

mylist = [ { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 }, 
      { 'name': 'Jack', 'school': 'UCLA', 'date_joined': 2001 }, 
      { 'name': 'Fisher', 'school': 'NYU', 'date_joined': 2003 }] 

は、どのように私は、特定の辞書はのみ名前と学校のキー/値に基づいて、既存のレコードと一致するかどうかを確認することができますか?だから、

example1 = { 'name': 'James', 'school': 'UCLA', 'date_joined': 2007 } 
example1 = { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 } 

が両方一致する必要がありますが、

example3 = { 'name': 'James', 'school': 'MIT', date_joined': 2001 } 

はいけません。

明らかにあります:

for m in myList: 
    if (m['name']==example['name'] and m['school']==example['school']): 
     match_found = True 
     continue 

が、よりコンパクトな方法はありますか?あなたのプログラムの構造についての詳細は何も知らない

+0

をしますが、別の[を使用して検討するかもしれませんデータ構造](http://stackoverflow.com/questions/6479377/in-list-of-dicts-match-dict-based-on-one-key-value/6479532#6479532)。 – senderle

答えて

4
fields = ('name', 'school') 
match_found = any(all(x[f]==example[f] for f in fields) for x in myList) 
2
if all(m[k]==example[k] for k in ('school','name')) 
2

、私のアプローチは多少異なる場合があります:

from collections import namedtuple 
import datetime 

StudentRecord = namedtuple('StudentRecord', 'name school date_joined') 
myset = set([StudentRecord('James', 'UCLA', 2001), 
      StudentRecord('Jack', 'UCLA', 2001), 
      StudentRecord('Fisher', 'NYU', 2003)]) 
this_year = datetime.datetime.today().year 
match_found = any(StudentRecord('James', 'UCLA', year) in myset for year in range(1950, this_year)) 

それはすべてのためにチェックしなければならないので、これは非常に小さなリストの遅くなります1950年以前に何人も学校に入学しなかった何千人もの学生のリストの場合、これははるかに速くなります。年数ではO(n)ですが、リストアプローチは学生数ではO(n)ですが、年数はおそらく学生数よりもはるかにゆっくりと増加します。 (しかし、レコードは同じではないことが必要ですが、とにかくそれを必要とするかもしれません)また、衝突を処理するために、リストの代わりにリストを使用することもできます)。

また、あなたがこれを行うことができます時間アルゴリズムは、複数の同一の学生のリストのための年のリストを使用しても、衝突の問題に対処いる:少し遅れてこれでゲームに来

StudentRecord = namedtuple('StudentRecord', 'name school') 
mydict = {StudentRecord('James', 'UCLA'):[2001], 
      StudentRecord('Jack', 'UCLA') :[2001], 
      StudentRecord('Fisher', 'NYU'):[2003, 2007]} 
match_found = StudentRecord('James', 'UCLA') in mydict 
+0

+1より良いデータ構造FTW。これが例の全体でない限り、私はメモリ内の 'sqlite'データベースが実際にはより良いかもしれないと推測しています。 – katrielalex

関連する問題