[英]Searching strings in lists of list for substring
我有一個由字符串列表組成的列表:
my_list = [[u'Port Name Status'],
[u'Int1 London connected'],
[u'Int2 Paris A disconnected'],
[u'Port3 Paris A Backup disabled']]
我曾考慮過用(“”)分割每個字符串,並像以前使用它們那樣創建元組,但是由於某些名稱是分開的,因此不起作用。
我想在每個字符串中搜索另一個列表中的項目,如果存在,請從my_list彈出它,我的完整代碼是
my_list = [[u'Port Name Status'],
[u'Int1 London connected'],
[u'Int2 Paris A disconnected'],
[u'Port3 Paris A Backup disabled']]
remove_from_list = ['Port', 'connected']
for i in my_list:
for j in remove_from_list:
if j in i:
my_list.pop(i)
除了無法正常工作外,我還知道我的代碼不是非常pythonic,是否有列表理解更好的方法呢?
我只希望刪除完全匹配項,因此將保留斷開連接但已連接的項刪除。
此列表理解應執行您想要的操作:
[li for li in my_list if not any(wi in li[0].split() for wi in remove_from_list)]
這產生
[[u'Int2 Paris A disconnected'],
[u'Port3 Paris A Backup disabled']]
它使用您提到的想法:拆分條目,然后使用any
檢查結果列表中是否包含任何單詞。
一些更多的解釋:
[li[0].split() for li in my_list]
產量
[[u'Port', u'Name', u'Status'],
[u'Int1', u'London', u'connected'],
[u'Int2', u'Paris', u'A', u'disconnected'],
[u'Port3', u'Paris', u'A', u'Backup', u'disabled']]
那是我們在列表理解中創建的新列表列表。 每個字符串被分割,產生一個單詞列表。 現在我們必須檢查這些子列表中是否有任何所需的字符串,我們可以通過另一個列表理解來做到:
[wi in [u'Port', u'Name', u'Status'] for wi in remove_from_list]
[True, False]
此列表推導返回一個帶有布爾變量的列表,該布爾變量指示是否在remove_from_list
中的元素被找到。 檢查此列表是否包含至少一個等於True
元素的快速方法是使用any
:
any([True, False])
True
和
any([False, False])
False
現在,我們可以將它們結合起來,以一開始就列出對表達的理解,從而使我們獲得理想的結果。
另外,如果要基於正則表達式進行拆分,則可以執行以下操作:
import re
[re.split('\s{2,}', li[0]) for li in my_list]
這使
[[u'Port', u'Name', u'Status'],
[u'Int1', u'London', u'connected'],
[u'Int2', u'Paris A', u'disconnected'],
[u'Port3', u'Paris A Backup', u'disabled']]
與上面的區別是,由於現在您至少要分割兩個空格,所以每個子列表最后總是只有三個字符串。 我認為這就是您最初的想法; 在您的情況下,這沒有什么區別,因為remove_from_list
僅包含單個單詞,但是如果remove_from_list
中的字符串包含空格,則第一種方法將失敗:然后,應將其與正則表達式一起使用。
然后是整個命令
[li for li in my_list if not any(wi in re.split('\s{2,}', li[0]) for wi in remove_from_list)]
也屈服
[[u'Int2 Paris A disconnected'],
[u'Port3 Paris A Backup disabled']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.