将dict.keys()与list,表达式中的bug进行比较

时间:2013-07-30 13:45:45

标签: python dictionary

我正在尝试将每个字典键与列表中的值进行比较:

order = {
    u'custom_attributes_desc': {u'text': u'Food truck', u'name': u'Bob', u'email': u'bob@yahoo.com'}, 
    u'account_id': 12345, 
    u'state_desc': u'open', 
    u'start_dt': u'2013-07-25 15:41:37', 
    u'end_dt': u'2013-07-25 19:41:37', 
    u'product_nm': u'foo', 
    u'transaction_id': 12345, 
    u'product_id': 1111
}
match = ['transaction_id', 'account_id', 'product_nm']
not_matched_keys = [key_match for key_order, key_match in zip(order.keys(),match) if key_order != key_match]

结果我得到了:

not_matched_keys
['transaction_id', 'account_id', 'product_nm']

但我想看看

[]

因为匹配的键在字典中。

2 个答案:

答案 0 :(得分:3)

如果您要列出从match中取得的 not 字典中的密钥,请使用列表理解:

not_matched_keys = [key for key in match if key not in order]

您的代码创建了3对,match中每个元素之一,order中有3个任意键。如果这三个任意键碰巧不等于match中的3个值,则它们都包含在您的输出中:

>>> order = {u'custom_attributes_desc': {u'text': u'Food truck', u'name': u'Bob', u'email': u'bob@yahoo.com'}, u'account_id': 12345, u'state_desc': u'open', u'start_dt': u'2013-07-25 15:41:37', u'end_dt': u'2013-07-25 19:41:37', u'product_nm': u'foo', u'transaction_id': 12345, u'product_id': 1111}
>>> match = ['transaction_id', 'account_id', 'product_nm']
>>> list(zip(match, order.keys()))
[('transaction_id', 'end_dt'), ('account_id', 'product_id'), ('product_nm', 'transaction_id')]

答案 1 :(得分:1)

你也可以在这里使用filter()

>>> filter(lambda x: x not in order, not_matched_keys)
[]