Python 在dict列表中,是否基于一个键/值匹配dict?

Python 在dict列表中,是否基于一个键/值匹配dict?,python,Python,在Python中,我有一个字典列表: mylist = [ { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 }, { 'name': 'Jack', 'school': 'UCLA', 'date_joined': 2001 }, { 'name': 'Fisher', 'school': 'NYU', 'date_joined': 2003 }] 如何仅根据名称和学校密钥/值检查某个

在Python中,我有一个字典列表:

mylist = [ { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 },
           { 'name': 'Jack', 'school': 'UCLA', 'date_joined': 2001 },
           { 'name': 'Fisher', 'school': 'NYU', 'date_joined': 2003 }]
如何仅根据名称和学校密钥/值检查某个词典是否与现有记录匹配

因此:

应该两者都匹配,但是

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

但是有没有更简洁的方法呢?

我对程序的结构一无所知,我的方法可能有些不同:

fields = ('name', 'school')
match_found = any(all(x[f]==example[f] for f in fields) for x in myList)
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),年数的增长可能比学生人数的增长慢得多。(虽然它并不要求任何记录都是相同的,但无论如何,您可能都希望这样。或者,您可以始终使用列表的dict而不是set来处理冲突。)

此外,对于真正的固定时间算法,您可以使用多个相同学生列表的年份列表来完成此操作,这也解决了冲突问题:

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

这个游戏有点晚了,但是你可以考虑使用.+ 1更好的数据结构FTW。虽然除非这是整个示例,否则我猜内存中的
sqlite
数据库可能会更好。
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))
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