Python从列表中删除项目

时间:2016-08-04 21:40:22

标签: python list items

我在从列表中删除项目时遇到了一些麻烦。我正在寻找更优雅的解决方案。优选地,一个用于环路或过滤器的解决方案。

该段代码的目标:从配置句柄中删除所有空条目和以“#”开头的所有条目。

目前我正在使用:

# Read the config file and put every line in a seperate entry in a list
configHandle = [item.rstrip('\n') for item in open('config.conf')]

# Strip comment items from the configHandle
for item in configHandle:
    if item.startswith('#'):
        configHandle.remove(item)

# remove all empty items in handle
configHandle = filter(lambda a: a != '', configHandle)
print configHandle

这有效,但我认为这是一个令人讨厌的解决方案。

当我尝试:

# Read the config file and put every line in a seperate entry in a list
configHandle = [item.rstrip('\n') for item in open('config.conf')]

# Strip comment items and empty items from the configHandle
for item in configHandle:
    if item.startswith('#'):
        configHandle.remove(item)
    elif len(item) == 0:
        configHandle.remove(item)

然而,这失败了。我无法弄清楚原因。

有人能把我推向正确的方向吗?

4 个答案:

答案 0 :(得分:1)

因为您在迭代时更改列表。你可以使用列表理解来解决这个问题:

configHandle = [i for i in configHandle if i and not i.startswith('#')]

同样,对于打开文件,最好使用with语句自动关闭块末尾的文件 1

with open('config.conf') as infile :
   configHandle = infile.splitlines()
   configHandle = [line for line in configHandle if line and not line.startswith('#')]

<子> 1.因为无法保证垃圾收集器收集外部链接。并且您需要显式地关闭它们,这可以通过调用文件对象的close()方法来完成,或者通过使用with语句以更加pythonic的方式提到。

答案 1 :(得分:1)

迭代时不要删除项目,这是一个常见的陷阱

答案 2 :(得分:0)

您不能修改您正在迭代的项目。

相反,您应该使用filter或列表推导等内容。

configHandle = filter(lambda a: (a != '') and not a.startswith('#'), configHandle)

答案 3 :(得分:0)

你的filter表达是好的;只需提供您正在寻找的附加条件:

configHandle = filter(lambda a: a != '' and not a.startswith('#'), configHandle)


如果您不想使用filter,还有其他选择,但正如其他答案中所述,在您迭代时尝试修改列表是一个非常糟糕的主意它。 this stackoverflow问题的答案提供了使用filter根据条件从列表中删除的替代方法。