比较列表中的元组,我有包含地址详情的列表,我需要比较两个地址是否相同,
address1= [('1546-1711', 'AddressNumber'),
('South', 'StreetNamePreDirectional'),
('4650', 'AddressNumber'),
('West,', 'StreetNamePostDirectional'),
('Green', 'PlaceName'),
('Lake', 'PlaceName'),
('town,', 'PlaceName'),
('MI', 'StateName'),
('84107', 'ZipCode')]
address2 = [('800', 'AddressNumber'),
('Green', 'StreetName'),
('Lake', 'PlaceName'),
('town,', 'PlaceName'),
('MI', 'StateName'),
('84110', 'ZipCode')]
第二个地址中缺少一些属性,例如' StreetNamePreDirectional'和' StreetNamePostDirectional',所以我必须比较剩余的属性,无论哪个存在,所以首先我需要检查两者之间的共同属性,然后比较它们是否具有匹配的值,是什么? pythonic方式做到这一点
到目前为止我的代码:
for item1 in add2:
for item2 in add1:
if(item2[1]=='AddressNumber' and item1[1]=='AddressNumber'):
addressnumbermatch = True
if(item2[1]=='StreetNamePreDirectional' == item1[1]=='StreetNamePreDirectional'):
StreeNameDirectionMatch = True
if(item2[1]=='StreetNamePreDirectional' == item1[1]=='StreetNamePreDirectional'):
StreetNamePreDirectionalMatch = True
if(addressnumbermatch and StreeNameDirectionMatch and StreetNamePreDirectionalMatch ):
# Do somthing
注意:有多个属性,如AddressNumber和Place Name,因此它应匹配多个值中的任何一个值。所以第一个地址包含两个地址号,因此需要检查这两个值中的任何一个是否与Address2的地址号匹配
答案 0 :(得分:1)
(除了问题@glibdud指出)我想,要走的路是使用set
。
s1 = set(address1)
s2 = set(address2)
common = s1.intersection(s2)
当然,您可以使用更多设置操作来确定重叠是否足够相似,但我们没有关于您数据的信息。
在这种情况下,它将输出:
s1.intersection(s2)
Out[31]: {('Lake', 'PlaceName'), ('MI', 'StateName'), ('town,', 'PlaceName')}
最后,我从问题的定义中得到了感觉,其中两个中的一个可以包含多个地址,您想知道地址寄存器中是否列出了地址。在这种情况下,您需要使用intersection
或s1.issuperset(s2)
来代替s2.issubset(s1)
,这会使您返回一个很好的bool
。
s1.issuperset(s2)
>> False
答案 1 :(得分:1)
这样做的一个好方法是使用一个函数从元组列表中提取所需的信息,即
def get_address_info(address_data):
address_number = None
street_name_pre_directional = None
street_name_post_directional = None
for value, property_name in address_data:
if property_name == "AddressNumber":
address_number = value
elif property_name == "StreetNamePreDirectional":
street_name_pre_directional = value
elif property_name == "StreetNamePostDirectional":
street_name_post_directional = value
return address_number, street_name_pre_directional, street_name_post_directional
这样你就不必相互比较物品,维护也更容易
现在,您可以获取必要的数据并直接比较它们,并通过检查信息中是否存在None
来确定是否缺少某些信息
add1_info = get_address_info(add1)
add2_info = get_address_info(add2)
if add1_info == add2_info and None not in add1_info and None not in add2_info :
#do something...