我有两种类型的地址:
Unit 5, 123 Fake Street Drive
123 Fake St Dr, Unit 5
如何使用Python通过数字比较两个地址?
例如:
Unit 5, 123 Fake Street Drive -> [5,123]
123 Fake St Dr, Unit 5 -> [123,5]
TRUE
123 Fake Street Drive -> [123]
123 Fake St Dr, Unit 5 -> [123,5]
FALSE
Unit 5, 155 Fake Street Drive -> [155,5]
123 Fake St Dr, Unit 5 -> [123,5]
FALSE
我现在拥有的只是:
if bool(set([int(s) for s in address.split() if s.isdigit()]) & set([int(s) for s in address2.split() if s.isdigit()])):
我想知道一个数字列表是否与另一个数字列表相同,无论顺序如何。
答案 0 :(得分:3)
您只需构建提取数字的set
并将其与==
进行比较。 set
非常支持平等。
此处的另一个问题是,str.split()
对5,
的效果不会很好。所以isdigit()
失败,你的集合不相等。
让我建议re.findall
找到数字,将它们放入集合并进行比较,使用\d+
或\b\d+\b
来避免单词内的数字(例如N2P
)< / p>
import re
address="Unit 5, 123 Fake Street Drive"
address2 = "123 Fake St Dr, Unit 5"
pattern = r"\b\d+\b"
print(set(re.findall(pattern,address))==set(re.findall(pattern,address2)))
这会产生True
,而如果我从上面的一个列表中更改/添加/删除一个号码,我会得到False
正如评论中所建议的那样,如果一个字符串中有重复的数字,则上述情况失败,而另一个字符串中则没有:我们可能会因为set
符号重复而产生误报。
如果这是一个问题,那么将set
替换为collections.Counter
修复
collections.Counter(re.findall(pattern,address))==collections.Counter(re.findall(pattern,address2))
也可以,Counter
是一本字典并与其他词典进行比较。
答案 1 :(得分:0)
我建议您使用排序列表,而不是集合。该集合无法区分“单位1,1街道X”和“1街道Y” - 但排序列表将会这样做。