[英]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']
意思是,你选择的每一个元素i
在bar
,如果,每一个元素j
在foo
, j
不包含在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
%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.