我有一个像这样的元组
full = [('Ethernet4/3', 'odsa', 'connected'),('Port-Channel161', 'odsa', 'connected'),('Port-Channel545', 'odsa', 'connected')]我想要删除所有端口通道,只返回接口。我可以在一个列表中对每个端口通道进行硬编码,并以这种方式删除它,但这并不是非常可伸缩的。我试图从列表中删除任何带有“端口”的内容,所以我的脚本如下所示
full = [('Ethernet4/3', 'odsa', 'connected'),('Port-Channel161', 'odsa', 'connected')]
skip_interfaces = ['Ethernet49/1', 'Ethernet49/2', 'Ethernet49/3', 'Ethernet49/4', 'Ethernet50/1', 'Ethernet50/2', 'Ethernet50/3','Ethernet50/4','Ethernet51/1',
'Ethernet51/2', 'Ethernet51/3', 'Ethernet51/4', 'Ethernet52/1', 'Ethernet52/2', 'Ethernet52/3', 'Ethernet52/4', 'Port', 'Management1', 'Port-Channel44', 'Port-Channel34']
new = [tup for tup in full if tup[0] not in skip_interfaces]
print new但印出来的时候我还是
[('Ethernet4/3', 'odsa', 'connected'),('Port-Channel161', 'odsa', 'connected'),('Port-Channel545', 'odsa', 'connected')]当子字符串在列表中时,是否有更好的方法从元组中删除项?
谢谢
发布于 2018-01-03 11:16:30
您可以使用str.startswith筛选出其第一个元素以"Port“或”Port“开头的所有元组,使用列表理解。str.startwsith可以与下面列出的几种替代方案结合使用。
选项1
列表理解
>>> [i for i in full if not i[0].startswith('Port')] # .startswith('Port-Channel')
[('Ethernet4/3', 'odsa', 'connected')]或者,您可以对not in进行i[0]检查,这将根据i[0]是否在任何地方包含“端口”来筛选元素。
>>> [i for i in full if 'Port' not in i[0]]
[('Ethernet4/3', 'odsa', 'connected')] 选项2
香草for环
第二种方法(非常类似于第一种方法)是使用普通的ol‘for循环。遍历full并使用if子句进行检查。
r = []
for i in full:
if not i[0].startswith('Port'):
r.append(i)选项3
filter
filter是这里的另一种选择。filter删除不符合特定条件的元素。这里的条件是第一个参数,作为一个lambda传递。第二个参数是要过滤的列表。
>>> list(filter(lambda x: not x[0].startswith('Port'), full))
[('Ethernet4/3', 'odsa', 'connected')]与列表理解相比,filter通常要慢一些。对于简洁的代码来说,仍然是一个有用的构造,并且在更大的管道中链接更多的表达式。
注意:您不应该使用remove和del之类的方法来迭代具有循环和删除元素的列表。这将导致列表收缩,最终结果是循环将没有机会对列表元素进行完全迭代。
https://stackoverflow.com/questions/48076228
复制相似问题