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

时间:2016-04-29 13:18:36

标签: python list comparison

如果这个问题措辞严厉,我道歉。

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

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']

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

3 个答案:

答案 0 :(得分:2)

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

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]}

现在您的数据存储在dict中

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()

答案 1 :(得分:1)

像@avinash所说,使用切片:

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

答案 2 :(得分:-1)

我真的不明白你的意思。你想在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']