字典清单

时间:2019-03-05 01:41:11

标签: python

想象一下我有这个列表:

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')

这种类型的代码不起作用,对吗? 那么我该如何解决第二步(在第一步之后)?

2 个答案:

答案 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

后者效率更高,因为它仅对列表进行一次迭代(如果找到匹配项,则不会对所有列表进行迭代)。