在字典列表中,根据键值匹配字典?
在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
但是有没有更简洁的方法呢?
3 个回答
if all(m[k]==example[k] for k in ('school','name'))
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
我对你程序的结构了解不多,所以我的方法可能会有些不同:
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),这里的n是年份的数量,而列表的方法是O(n),这里的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
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当你点击一个按钮,程序就会做出反应。这个过程就叫做“事件处理”。
事件处理的基本思路是:程序在运行的时候,会一直等待用户的操作,比如鼠标点击、键盘输入等。当这些操作发生时,程序就会“捕捉”到这些事件,然后根据预先设定的规则来执行相应的代码。
举个例子,想象一下你在玩一个游戏,按下“开始”按钮后,游戏就会开始。这就是事件处理的一个简单例子:按钮被点击(事件发生),程序就执行开始游戏的代码。
在编程中,我们通常会使用一些特定的语法来设置这些事件和对应的处理方式。这样一来,程序就能根据用户的操作灵活地做出反应。
总之,事件处理就是让程序能够根据用户的动作来做出相应的反应,提升用户体验。
fields = ('name', 'school')
match_found = any(all(x[f]==example[f] for f in fields) for x in myList)