如果元组的第一个项等于任何给定字符串,则从列表中删除元组

2024-10-05 13:16:39 发布

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

我的清单如下:

device = [('nvme2n1',), 
          ('nvme1n1', '/local'), 
          ('nvme0n1',), 
          ('nvme0n1p1', '/'),
          ('nvme0n1p128',), 
          ('nvme3n1',)]

我想从包含nvme1n1nvme0n1p1nvme0n1p128nvme0n1的列表中删除几个元组

因此,最终的名单将有

final_device = [('nvme2n1',),('nvme3n1',)]

按以下方式尝试,但不起作用&;获取错误"AttributeError: 'tuple' object has no attribute 'startswith'"

for word in devices[:]: 
    if word.startswith("nvme0n1","nvme0n1p1","nvme0n1p128"): 
        devices.remove(word)

有人能帮忙吗


Tags: 列表devicelocalwordfinal元组devices名单
3条回答
devices = [('nvme2n1',), ('nvme1n1', '/local'),
           ('nvme0n1',), ('nvme0n1p1', '/'), 
           ('nvme0n1p128',), ('nvme3n1',)]
devices = [device for device in devices if device[0] not in 
           (("nvme0n1", "nvme0n1p1", "nvme0n1p128", "nvme0n1"))]
print(devices)

输出

[('nvme2n1',), ('nvme1n1', '/local'), ('nvme3n1',)]

@JamesTollefson在他们的回答中指出了代码中的特定问题以及如何解决它。这是完全不同的,在我看来,更好/更干净的方式来实现你想要的

devices列表中迭代的word是元组。您需要访问您感兴趣的元组的该部分,如下所示:

for word in devices[:]: 
    if word[0] in ["nvme0n1","nvme0n1p1","nvme0n1p128"]: 
        devices.remove(word)

您甚至可以使用列表理解来简化它。 正如James在回答中提到的,您需要执行word[0],因为word是一个元组而不是字符串

startswith可以使用元组进行检查

[dev for dev in devices if not dev[0].startswith(("nvme0n1","nvme0n1p1","nvme0n1p128"))]

但是如果你想找到精确的匹配,你可以

[dev for dev in devices if dev[0] not in ("nvme0n1","nvme0n1p1","nvme0n1p128")]

相关问题 更多 >

    热门问题