如何检查变量是否位于python字典中的列表中?

如何检查变量是否位于python字典中的列表中?,python,list,loops,python-2.7,dictionary,Python,List,Loops,Python 2.7,Dictionary,我正在编写一个分配客户许可证的程序。但是,无论何时更改数据库中的许可证,都需要在另一个程序中进行更改。然而,我遇到了麻烦,因为我在字典中嵌套了一个列表,当我在字典中使用if-id时,它找不到它,即使我确实知道它在那里 annotation = {'customer_id': 35, 'guest_os': 1287, 'license': [('VMware VM', 01), ('Veeam Backup VM', 02)]} database_license = [('Veeam Back

我正在编写一个分配客户许可证的程序。但是,无论何时更改数据库中的许可证,都需要在另一个程序中进行更改。然而,我遇到了麻烦,因为我在字典中嵌套了一个列表,当我在字典中使用if-id时,它找不到它,即使我确实知道它在那里

annotation = {'customer_id': 35, 'guest_os': 1287, 'license': [('VMware VM', 01), ('Veeam Backup VM', 02)]}

database_license = [('Veeam Backup VM', 02), ('VMware VM', 01)]

for product, license_id in annotation['license']:
    if license_id in database_license:
       print "do nothing"
    else:
       del annotation['license']
       annotation['license'] = database_license
       change = True

    if change == True:         
       annotation['license'] = license_check
       change_annotation(vm_mor, annotation)
       change = False    
由于某些原因,我似乎无法修复它,因此在列表数据库中找不到值license\u id\u licenses它只是执行else,而不是什么都不打印

有什么想法吗

我想在中使用,因为它们可能是无序的,因此,如果您循环使用这两个id,并使用如果ths id==该id,它将不总是工作

这是工作代码:

 if str(vm_mor) == vm['config.annotation']:
    annotation= pickle.load(open(str(vm_mor), "rb"))
    print annotation

    sql_check_exist = '''select a.vm_mor, b.license_id, c.product from vms a , vm_licenses b, licenses c where a.vm_id = b.vm_id and b.license_id = c.license_id and a.vm_mor = '%s' ''' % str(vm_mor) 
    cursor_exist.execute(sql_check_exist)
    database_license = []

    for vm_mor, license_id, product in cursor_exist:
       database_license.append((product,license_id))

    checklist_database_license = [int(i[1]) for i in database_license] #make a list of 2nd element of all the tuples in the database_license list
    check_me = annotation['license']

    for product, license_id in check_me:
       if license_id in checklist_database_license:
          print "do nothing"
       else:
          del annotation['license']
          annotation['license'] = database_license
          change = True

    if change == True:         
       change_annotation(vm_mor, annotation)
       change = False    

 else:
    print vm['config.name']
    pickle_mor(vm_mor,vm) 

注释['license']
是一个包含两个元组的列表:

>>> annotation = {'customer_id': 35, 'guest_os': 1287, 'license': [('VMware VM', 01), ('Veeam Backup VM', 02)]}
>>> aList = annotation['license']
>>> aList[0]
('VMware VM', 1)
>>> aList[1]
('Veeam Backup VM', 2)
>>> (product, license_id) = aList[0]
>>> product
'VMware VM'
>>> license_id
1
>>>

希望这能澄清问题。

您已经将
数据库许可证
定义为元组(对)列表,因此其中不可能包含
35
这样的字符串

database_license = [('Veeam Backup VM', 02), ('VMware VM', 01)]
checklist_database_license = [int(i[1]) for i in database_license] #make a list of 2nd element of all the tuples in the database_license list

for product, license_id in annotation['license']:
    if license_id in checklist_database_license:
       print "do nothing"
    else:
       del annotation['license']
       annotation['license'] = database_license
       change = True
您要检查的是,是否有任何成员具有匹配的id。如下所示:

if any(product_license_id == license_id
       for product, license_id in database_license):
…或:

if product_license_id in map(itemgetter(1), database_license):
但最好将
数据库\u许可证
存储为
目录
,将许可证ID映射到产品:

database_license = {2: 'Veeam Backup', 1: 'VMWare VM'}

那么您现有的代码就可以正常工作。

作为补充,您几乎肯定不想编写
01
02
。在Python2.7中,前导的
0
意味着它们是八进制数,对于前7个数字没有什么不同,但是一旦到达
08
它将是一个错误,更糟糕的是,对于
010
它看起来会工作,但却是错误的值。(另外,在Python3.x中,
0
前缀是非法的。)还有一个小提示:如果change==True:,不要写
,如果change:
,只写
(除非您确实需要将
True
与其他偶尔出现的真实值区分开来,但这是非常罕见的)@abarnert ya我把01和02放在一起,这不是真实的数字,但不想泄露客户数据。谢谢你提供的关于if change的提示:这是否意味着if change:wont catch是假的?谢谢,我结合了两个回答。谢谢你的解释,这是我的想法,但我不确定该怎么做。我喜欢创建一个单独的数字列表,这是一个天才的想法。