Python 针对这两个列表执行缺少项检查的最佳方法是什么

Python 针对这两个列表执行缺少项检查的最佳方法是什么,python,regex,python-3.x,Python,Regex,Python 3.x,我需要检查两张清单之间是否有遗漏的项目。显示支票中有哪些账户,但不在账户代码列表中。我想我这里需要正则表达式 Account_codes = ['55555', '000002255a1', '98123a026', '4561b', '0000012e5', '987654321'] Check = ['55555', '2255a1', '123a', '0004561b', '00000012e56', '0987654321'] 在本例中,只有两项不匹配。12e56和123a 正如你所

我需要检查两张清单之间是否有遗漏的项目。显示支票中有哪些账户,但不在账户代码列表中。我想我这里需要正则表达式

Account_codes = ['55555', '000002255a1', '98123a026', '4561b', '0000012e5', '987654321']
Check = ['55555', '2255a1', '123a', '0004561b', '00000012e56', '0987654321']
在本例中,只有两项不匹配。12e56和123a 正如你所看到的,我的困难在于,双方的数据并不完全相同。填充似乎在某个点发生,然后停止。有些数据用零填充,有些则不是。实际数据集很大,因此我需要在任何解决方案中牢记这一点

我的直接想法是从两侧去掉所有前导零,如下所示:

stripped_acct = [item.lstrip('0') for item in Account_codes]
stripped_check = [item.lstrip('0') for item in Check]
matches = []
missing_from_acct = []
for item in stripped_check:
    if item in stripped_acct:
        matches.append(item)
    else:
        missing_from_account.append(item)
这个问题有更好的解决方案吗?或者您是否看到我现有的代码中有任何低效之处

试试这些:

missing_from_account = list(set([item.lstrip('0') for item in Check])-set([item.lstrip('0') for item in Account_codes]))


matches = list(set([item.lstrip('0') for item in Check]).intersection(set([item.lstrip('0') for item in Account_codes])))

对于此类操作,集合是最有效的:

a_set = set([i.lstrip('0') for i in Account_codes])
c_set = set([i.lstrip('0') for i in Check])
list(c_set - a_set)

>> ['123a', '12e56']

我将使用正则表达式删除主字符串前面的所有“0”,然后使用差集来找出遗漏的内容

import re
Account_codes = ['55555', '000002255a1', '98123a026', '4561b', '0000012e5', '987654321']
Check = ['55555', '2255a1', '123a', '0004561b', '00000012e56', '0987654321']

Check_nozero = [re.findall(r"([0]+|0?)(\w+)",ele)[0][-1]  for ele in Check]
Account_codes_nozero = [re.findall(r"([0]+|0?)(\w+)",ele)[0][-1]  for ele in Account_codes]
print( list(set(Check_nozero) - set(Account_codes_nozero)) )

为什么不使用像difference这样的简单集合操作呢?基本上是比较数组中的第i个元素是否与另一个元素结束。比如,00000251和251是匹配的,而0000251和2510不是。我不确定Python正则表达式,但在Bash shell中,我们通常将其与*字符进行比较。类似于,如果检查中的firstVar=*secondVar有一个值“00000012e56”,在账户代码中有一个值“0000012e5”。他们应该是一对吗?我这样问是因为你似乎不确定这些弦是如何被填充或改变的。似乎帐户代码被截断了,所以我认为您可能仍然希望该检查值匹配。此外,您的值看起来很像十六进制,因此如果是十六进制,您可以将其转换为int:inti,16,而不是剥离