匹配列表中的元组值

时间:2018-01-22 14:21:06

标签: python-3.x tuples

比较列表中的元组,我有包含地址详情的列表,我需要比较两个地址是否相同,

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的地址号匹配

2 个答案:

答案 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')}

最后,我从问题的定义中得到了感觉,其中两个中的一个可以包含多个地址,您想知道地址寄存器中是否列出了地址。在这种情况下,您需要使用intersections1.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...