匹配列表中的类似项目

时间:2016-08-26 16:45:50

标签: python list

我有两个主机名列表

foo=['some-router-1', 'some-switch-1', 'some-switch-2']

bar=['some-router-1-lo','some-switch-1','some-switch-2-mgmt','some-switch-3-mgmt']

我希望输出就像......

out=['some-switch-3-mgmt']

我想在bar中找到不在foo中的条目。但是bar中的某些名称"-mgmt"或附加的其他字符串不会出现在foo中。每个列表项的破折号的长度和数量差别很大,所以我不确定使用正则表达式会有多成功。我是编程新手,所以请尽可能提供一些解释。

4 个答案:

答案 0 :(得分:0)

您可以使用列表推导和all

执行此操作
>>> out = [i for i in bar if all(j not in i for j in foo)]    
>>> out
['some-switch-3-mgmt']

意思是,如果ibar中的每个元素都j foo中未包含j,则选择i中的每个元素require('./app/routes.js') }。

答案 1 :(得分:0)

您可以使用>>> filter(lambda x: x if not any(x.startswith(f) for f in foo) else None, bar) ['some-switch-3-mgmt'] 作为:

来实现它
startswith

我正在使用bar检查foo的任何元素是否以x.full_name的任何元素开头

答案 2 :(得分:0)

您可以使用startswith()查看字符串是否以另一个字符串开头。如下所示:

out = [bar_string for bar_string in bar if not bar_string.startswith(tuple(foo))]

答案 3 :(得分:0)

bar 中重复元素时,@ jim和@bbkglb提供的解决方案存在一些问题。这些解决方案应转换为 。我测试了解决方案及其响应时间:

foo=['some-router-1', 'some-switch-1', 'some-switch-2']*1000
bar=['some-router-1-lo','some-switch-1','some-switch-2-mgmt','some-switch-3-mgmt']*10000

使用filter - lambda

%timeit set(filter(lambda x: x if not any(x.startswith(f) for f in foo) else None, bar))
1 loop, best of 3: 7.65 s per loop

使用all

%timeit set([i for i in bar if all(j not in i for j in foo)])
1 loop, best of 3: 7.97 s per loop

使用any

%timeit set(b for b in bar if not any(b.startswith(f) for f in foo))
1 loop, best of 3: 7.97 s per loop