簡體   English   中英

在列表列表中搜索字符串以查找子字符串

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM