想象一下我有这个列表:
a=[ {'name':'John','number':'123'} , {'name':'Mike','number':'12345'} ,{'name':'Peter','number':'12'}]
name=input('insert your name')
number=input('insert your number')
如果我想使用3种情况:一种是名称和数字匹配的情况,另一种是名称正确但数字不正确的情况,最后一种是名称不存在的情况。
if {'name':name,'number':number} in a:
print('okay')
else:
if {'name':name} in a and {'number':number} not in a:
print('user okay, but incorrect pass')
else:
print('No username')
这种类型的代码不起作用,对吗? 那么我该如何解决第二步(在第一步之后)?
答案 0 :(得分:2)
您可以像这样使用any
:
if {'name':name,'number':number} in a:
print('okay')
elif any(entry["name"] == name for entry in a):
print('user okay, but incorrect pass')
else:
print('No username')
我还将您的else: if:
简化为使用elif:
。
答案 1 :(得分:1)
我实际上会使用列表理解来编写这样的代码。似乎更具可读性。
if name in [pos['name'] for pos in a]:
if number == [dd for dd in a if dd['name'] == name][0]['number']:
print('okay')
else:
print('user okay but incorrect pass')
else:
print('No username')
或者,如果您可以使用for
循环,则可以:
for dd in a:
if name == dd['name']:
if number == dd['number']:
print('okay')
else:
print('user okay but incorrect pass')
break
else:
print('No username')
请注意else
循环后的for
:对此结构进行了解释here。
后者效率更高,因为它仅对列表进行一次迭代(如果找到匹配项,则不会对所有列表进行迭代)。