[英]Python: how to avoid append an empty string in a for loop?
我的代码的目标是编写一个函数并返回一个字符串列表,其中连续的字符串(水果名称)对应于连续的#No.1...#No.5
。 水果的整个名称被分成多行,我想在列表中将水果名称显示为没有空格的单个字符串。 我希望我的代码返回:
['Pear', 'Apple', 'Cherry', 'Banana', 'Peach']
但我得到了:
['', 'Pear', 'Apple', 'Cherry', 'Banana', 'Peach']
这些是我的文件fruit.txt
的内容:
#NO.1
P
ear
#NO.2
A
pp
l
e
#NO.3
Cherry
#NO.4
Banan
a
#NO.5
Pea
c
h
这些是我的代码:
def read(filename):
myfile = open('fruit', 'r')
seq = ''
list1 = []
for line in myfile:
if line[0] != '#':
seq +=line.rstrip('\n')
else:
list1.append(seq)
seq = ''
list1.append(seq)
return list1
如何避免追加一个不是我想要的空字符串? 我想我只需要调整一定代码行的位置,任何建议都值得赞赏。
你可以改变
else:
至
elif seq:
这将检查seq
是否为空,如果不是,则仅附加它。
从列表中删除空字符串的快速修复:
list1 = filter(None, list1)
这个解决方案与正则表达式如何? 以下是两步过程。 首先删除所有空格,如换行符,空格等。 然后找到符合您的模式#No.\\d
所有单词:
import re
whitespace = re.compile(r'\s*')
fruitdef = re.compile(r'#NO\.\d(\w*)')
inputfile = open('fruit', 'r').read()
inputstring = re.sub(whitespace, '', inputfile)
fruits = re.findall(fruitdef, inputstring)
print fruits
['梨','苹果','樱桃','香蕉','桃子']
缩小为oneliner:
import re
print re.findall(r'#NO\.\d(\w*)', re.sub(r'\s*', '', open('fruit', 'r').read()))
如果您想要单线解决方案,请选择:
with open('fruit.txt') as f:
content = f.read()
output = [''.join(x.split('\n')[1:len(x.split('\n'))+1]) for x in content.split('#') if len(x.split('\n')) > 1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.