在列表中的字符串中搜索子字符串

2024-05-15 18:01:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由字符串列表组成的列表:

my_list = [[u'Port    Name    Status'],
           [u'Int1    London    connected'],
           [u'Int2    Paris A    disconnected'],
           [u'Port3    Paris A Backup    disabled']]

我曾考虑过用(“”)分隔每个字符串,并像以前那样创建元组,但由于有些名称是分开的,所以这行不通。你知道吗

我想在每个字符串中搜索另一个列表中的项目,如果它存在,请从我的\列表中弹出它,我的完整代码是

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)

除了不工作,我也知道我的代码不是很python,有没有更好的方法与列表理解做到这一点?你知道吗

我只希望删除完全匹配的项,因此保留断开的项,但删除连接。你知道吗


Tags: 字符串namein列表portmystatuslist
1条回答
网友
1楼 · 发布于 2024-05-15 18:01:36

此列表应满足您的要求:

[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']]

它使用了您提到的思想:拆分条目,然后使用^{}检查结果列表中是否包含任何单词。你知道吗

更多解释:

[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']]

相关问题 更多 >