2015-04-01 121 views
-1

我要比较两个组,并找到在蟒蛇的区别:蟒蛇比较的元组和字典

>>> mysql_orders = ((50434L, 5901L), (50733L, 5901L)) 
>>> opera_orders = [{'orderId': 'WEB050434', 'accountId': '00T001'}, {'orderId': 'WEB050733', 'accountId': '00T001'}, {'orderId': 'DOC075185', 'accountId': '00T001'}, {'orderId': 'WEB081859', 'accountId': '00T001'}] 

一个是元组列表和字典其中列表中的第一个项目可能是另外一个列表没有WEB/DOC前缀的orederId

找不到mysql_orders列表中缺失的orderId的正确方法是什么?

+2

绝对零功夫。尝试自己编写代码并将其发布到您的问题中。 – smci 2015-04-01 10:07:47

+1

也许为你的示例数据包含所需的函数输出会有帮助吗? – 2015-04-01 10:08:08

+0

您的订单ID前缀为“WEB/DOC”或“WEB0/DOC0”?而你的mysql_order ids似乎是Long类型的。那么你会如何比较呢? – 2015-04-01 10:09:48

回答

0

使用正则表达式去除字母,但前提是数字总是晚一些,

import re 

mysql_orders = ((50434L, 5901L), (50733L, 5901L)) 

opera_orders = [{'orderId': 'WEB050434', 'accountId': '00T001'}, {'orderId': 'WEB050733', 'accountId': '00T001'}, {'orderId': 'DOC075185', 'accountId': '00T001'}, {'orderId': 'WEB081859', 'accountId': '00T001'}] 

mysql_orders = [element for tupl in mysql_orders for element in tupl] 

missing_order_ids = [opera_order['orderId'] for opera_order in opera_orders if long(re.split('\D+', opera_order['orderId'])[1]) not in mysql_orders] 

print missing_order_ids 
0

如果信件可能会或可能不会有,但领先的0是永远存在的,你可以用一组带:

from string import ascii_letters 

st = set(str(a) for a,_ in mysql_orders) 

missing = [d['orderId'] for d in opera_orders if not d['orderId'].strip(ascii_letters)[1:] in st] 

print(missing) 

['DOC075185', 'WEB081859'] 

如果前缀是永远存在的只是切片:

missing = [d['orderId'] for d in opera_orders if not d['orderId'][4:] in st]