我有两个主机名列表
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
中。每个列表项的破折号的长度和数量差别很大,所以我不确定使用正则表达式会有多成功。我是编程新手,所以请尽可能提供一些解释。
答案 0 :(得分:0)
您可以使用列表推导和all
:
>>> out = [i for i in bar if all(j not in i for j in foo)]
>>> out
['some-switch-3-mgmt']
意思是,如果i
中bar
中的每个元素都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
%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
%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
%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