我有一个由字符串列表组成的列表:
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,有没有更好的方法与列表理解这样做?
我只想删除完全匹配,因此已断开的项目会停止,但已连接会被删除。
答案 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']]