我在从列表中删除项目时遇到了一些麻烦。我正在寻找更优雅的解决方案。优选地,一个用于环路或过滤器的解决方案。
该段代码的目标:从配置句柄中删除所有空条目和以“#”开头的所有条目。
目前我正在使用:
# 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)
然而,这失败了。我无法弄清楚原因。
有人能把我推向正确的方向吗?
答案 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
根据条件从列表中删除的替代方法。