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

时间:2018-01-28 20:42:36

标签: python list

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

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,有没有更好的方法与列表理解这样做?

我只想删除完全匹配,因此已断开的项目会停止,但已连接会被删除。

1 个答案:

答案 0 :(得分:4)

这个列表理解应该做你想要的:

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