我知道我必须在这里处理我的列表副本,以便在迭代时从中删除项目。
此处的示例代码查找3个子字符串。这看起来不像pythonic。
#!/usr/bin/env python3
with open('stringlist', 'r') as f:
mylist = f.read().splitlines()
for s in mylist[:]:
if 'Australia' in a:
mylist.remove(s)
if 'Canada' in a:
mylist.remove(s)
if 'USA' in a:
mylist.remove(s)
如何做得更优雅?
答案 0 :(得分:0)
如下所示:
unwanted = [
'Australia',
'Canada',
'USA',
]
my_list = []
with open('stringlist') as source:
for line in source:
if any(word in line for word in unwanted):
continue
my_list.append(line)
print(my_list)
代码目前尚未经过测试,但应该有效......
in-for-in
您应该阅读以下主题:
any(word in line for word in unwanted)
由三个独立的部分组成:
any(...)
- 如果任何列表元素为True
True
word in line
- 一个简单的表达式,用于测试word
line
for word in unwanted
- 一个内部 for循环,我们在unwanted
列表上循环,将每个元素放入word
执行相同操作的较长版本:
tmp_list = []
for word in unwanted:
tmp_bool = word in line
tmp_list.append(tmp_bool)
any(tmp_list)
当与括号[{1}}一起使用时,它被称为生成器表达式,但这通常被视为列表推导,其中一个使用方括号( ... )
。
[ ... ]
哪会返回10以下的奇数列表。