我有一个dicts列表,例如
[{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
我想检查字符串值是否与列表中任何dicts中的'name'值相同。例如,'Harold'将为False,但'George'将为True。
我意识到我可以通过遍历列表中的每个项目来做到这一点,但我想知道是否有更有效的方法?
答案 0 :(得分:14)
不,如果您只有这个词典列表,就没有更有效的方法。
但是,如果要经常查看,可以提取名称为:age items:
的字典l = [{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
d = dict((i['name'], i['age']) for i in l)
现在你有d
:
{'Bernard': 7, 'George': 4, 'Reginald': 6}
现在您可以查看:
'Harold' in d -> False
'George' in d -> True
它比迭代原始列表要快得多。
答案 1 :(得分:7)
与循环相比,有一种更有效的方法。如果您使用operators.itemgetter
,则可以执行简单的if x in y check
#to simply check if the list of dicts contains the key=>value pair
'George' in map(itemgetter('name'), list_of_dicts)
#if you want to get the index
index = map(itemgetter('name'), list_of_dicts).index("George") if 'George' in map(itemgetter('name'), list_of_dicts) else None
答案 2 :(得分:0)
l = [{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
search_for = 'George'
print True in map(lambda person: True if person['name'].lower() == search_for.lower() else False, l )
答案 3 :(得分:0)
smf = [{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
def names(d):
for i in d:
for key, value in i.iteritems():
if key == 'name':
yield value
In [5]: 'Bernard' in names(smf)
Out[5]: True
In [6]: 'Bernardadf' in names(smf)
Out[6]: False
答案 4 :(得分:0)
我认为列表理解也可以解决这个问题。
names = [i['name'] for i in l]
然后像这样使用它:
'Bernard' in names (True)
'Farkle' in names (False)
或一个班轮(如果它只有一张支票)
'Bernard' in [i['name'] for i in l] (True)