如何比较 Python 中的列表以进行部分匹配?

How to compare lists in Python for partial matches?

如果这个问题措辞不当,我深表歉意。

我的脚本是 运行 交易消息比较,写为字符串值,我希望查看是否有字段出现在一条消息中,而不是另一条消息中。使用的两个消息的示例是:

msg1 = ['35=D', '52=20160429', '11=0001A', '44=440', '15=EUR']
msg2 = ['35=D', '52=20160428', '11=0001B', '44=439', '15=EUR']

为了比较列表,我使用:

result = [o for o in a if o not in b]

现在,我的脚本向我提供了不完全匹配的元素,例如:

nonmatches = ['52=20160428', '11=0001B', '44=439']

这对我不起作用,因为标签仍然存在于两封邮件中。所以我的问题是 - 我将如何比较每个元素的前三个字符之后的两个列表?

如@avinash 所说,使用切片:

result = [o for o in msg1 if o[3:] not in [field[3:] for field in msg2]]

我不太明白你的意思。你想在 msg1 中找到不同的元素吗? 我在这里提供我的答案。

In [21]: msg1 = ['35=D', '52=20160429', '11=0001A', '44=440', '15=EUR']

In [22]: msg2 = ['35=D', '52=20160428', '11=0001B', '44=439', '15=EUR']

In [23]: [o for o in msg1 if o not in msg2]
Out[23]: ['52=20160429', '11=0001A', '44=440']

您确定列表表示法是您数据的最佳容器吗?也许你应该使用 dict

msg1 = ['35=D', '52=20160429', '11=0001A', '44=440', '15=EUR']
msg2 = ['35=D', '52=20160428', '11=0001B', '44=439', '15=EUR']

d1 = {key:value for key,value in [item.split('=',1) for item in msg1]}
d2 = {key:value for key,value in [item.split('=',1) for item in msg2]}

现在您的数据存储在字典中

print(d1)
# {'15': 'EUR', '44': '440', '11': '0001A', '35': 'D', '52': '20160429'}

print (d1.keys())
# dict_keys(['15', '44', '11', '35', '52'])

现在您可以使用集合操作,它的性能比上面@Phillip-Martin 的回答要好。

例如:

# All different keys
d1.keys() ^ d2.keys()

# Keys in d1 not in d2
d1.keys() - d2.keys()

# Keys in d2 not in d1
d2.keys() - d1.keys()