繁体   English   中英

匹配列表中的类似项目

[英]Match similar item in list

我有2个主机名列表

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没有出现的其他字符串。 每个列表项的破折号的长度和数量相差很大,因此我不确定使用正则表达式是否成功。 我是编程的新手,所以请尽可能提供一些说明。

您可以通过列表理解和all来做到这一点:

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

意思是,你选择的每一个元素ibar ,如果,每一个元素jfooj不包含在i

您可以通过使用filter来实现它:

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

我正在使用startswith检查bar任何元素是否以foo任何元素开头

您可以使用startswith()来查看一个字符串是否以另一个字符串开头。 所以像这样:

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

当在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

使用过滤器-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

全部使用:

%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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM