两个列表

时间:2015-08-08 05:09:03

标签: python list matching

所以我过去曾经遇到过这个问题,我需要对从一个列表到另一个列表的字符串部分进行一些字符串匹配,过去我曾在一个列表中使用过该解决方案。几种方式。今晚我提出了一个有效的解决方案,但我觉得可能有更有效的方法。

我从一个不同的项目中休息一下,使用我的HOST文件来阻止一堆广告域,以加快雅虎财务页面的加载。

结果列表是与受信任列表不匹配的域。

此代码适用于python 3.4,所以如果你也遇到过这个问题......那么我希望这也适合你。

def list_exclusion(suspect_list, trusted_list):

    loop_count = len(trusted_list)

    exclusion_list = []
    for domain in suspect_list:

        while loop_count > 0:

            if domain.find(trusted_list[loop_count - 1]) != -1:
                exclusion_list.append(domain)

            loop_count -= 1

        loop_count = len(trusted_list)

    bad_list = []
    for x in suspect_list:
        if x not in exclusion_list:
            bad_list.append(x)

    return bad_list

trusted_list = ['google.com', 'yahoo.com', 'yimg.com', 'thomsonreuters.com', 'stackexchange.com']

suspect_list = ['s1.2mdn.net', 'doubleclick.com', 'ads.facebook.com', 'electronics.stackexchange.com']

bad_list = list_exclusion(suspect_list, trusted_list)

for bad_guy in bad_list:
    print(bad_guy)

2 个答案:

答案 0 :(得分:1)

您可以使用in运算符进行包含检查(字符串是否是另一个字符串的子字符串),并且您也可以使用any()函数(以检查是否有任何字符串)字符串列表是另一个字符串的子字符串。例如 -

def list_exclusion(suspect_list, trusted_list):
    bad_list = []
    for x in suspect_list:
        if not any((i in x) for i in trusted_list):
            bad_list.append(x)
    return bad_list

示例/演示 -

>>> def list_exclusion(suspect_list, trusted_list):
...     bad_list = []
...     for x in suspect_list:
...             if not any((i in x) for i in trusted_list):
...                     bad_list.append(x)
...     return bad_list
...
>>> trusted_list = ['google.com', 'yahoo.com', 'yimg.com', 'thomsonreuters.com', 'stackexchange.com']
>>>
>>> suspect_list = ['s1.2mdn.net', 'doubleclick.com', 'ads.facebook.com', 'electronics.stackexchange.com']
>>>
>>> bad_list = list_exclusion(suspect_list, trusted_list)
>>>
>>> for bad_guy in bad_list:
...     print(bad_guy)
...
s1.2mdn.net
doubleclick.com
ads.facebook.com

答案 1 :(得分:1)

您只需使用all返回列表补偿:

def list_exclusion(suspect_list, trusted_list):
    return [domain for domain in suspect_list if all(domain.find(d) == -1 for d in trusted_list)]

或者使用in虽然它不会更快,甚至可能更慢:

def list_exclusion(suspect_list, trusted_list):
    return [domain for domain in suspect_list if all(d not in domain for d in trusted_list)]