<p>不要打印换行符,而是将它们写入文件:</p>
<pre><code>for line in input_f :
output_f.write("\n+ ")
for y in enumerate([x[0] for x in enumerate(line) if x[1]=='a']):
a = ("%d:%d" % (y[0]+1,y[1]+1))
output_f.write(a + " ")
</code></pre>
<p>您可以使用一些元组解包来更清楚地说明您正在枚举的内容,并且可以删除<code>[..]</code>列表理解,改用生成器表达式(节省一些内存和处理):</p>
<pre><code>for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
output_f.write('%d:%d ' % (i, pos))
</code></pre>
<p>我还为<code>enumerate()</code>函数提供了第二个参数,即起始值,这样就不必<code>+ 1</code>每个数字,并在字符串格式的文件输出中添加了空格。你知道吗</p>
<p>通常在写一行之后写一个换行符;如果每行需要一个计数器,请添加另一个枚举:</p>
<pre><code>for count, line in enumerate(input_f, 1):
output_f.write("%d+ " % count)
for i, pos in enumerate((pos for pos, char in enumerate(line, 1) if char == 'a'), 1):
output_f.write('%d:%d ' % (i, pos))
output_f.write('\n')
</code></pre>
<p>或者,通过使用<code>str.join()</code>,您可以一次性创建一整行,使用格式化在一个格式化操作中包含前缀和换行符:</p>
<pre><code>for count, line in enumerate(input_f, 1):
positions = (pos for pos, char in enumerate(line, 1) if char == 'a')
line = ' '.join(['%d:%d' % (i, pos) for i, pos in enumerate(positions, 1)])
output_f.write("%d+ %s\n" % (count, line))
</code></pre>
<p>这也巧妙地避免了尾随空格。你知道吗</p>