簡體   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