在dict列表中,根据一个键/值匹配dict?

2024-05-29 03:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我如何检查某个字典是否与现有记录匹配,只基于名称和学校密钥/值?在

所以:

^{pr2}$

两者应该匹配,但是

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

但是有没有更紧凑的方法呢?在


Tags: name名称列表date字典example记录jack
3条回答
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来处理冲突。)

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

^{pr2}$
if all(m[k]==example[k] for k in ('school','name'))

相关问题 更多 >

    热门问题