[英]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.