请解释:
>>> [line.rstrip() for line in open('foo')]
[',' 'hello text file6', '', '', '', 'goodby text file7', '', 'bye', '']
>>> with open('foo') as f: [line.rstrip() for line in f if line.rstrip()[-1:].isdigit()]
...
['hello text file6', 'goodby text file7']
[ - 1:]忽略空字符串,而上面的列表理解有它们。到目前为止,我习惯于切片只能在一个字符串内工作。 [-1:]切片似乎越过了许多字符串的边界。
答案 0 :(得分:1)
打破局面:
切片([::]
语法)将解决范围内的所有可能值。这意味着所有这些都是真的。
['cat'][0:1] == ['cat']
['cat'][1:2] == []
['cat'][-1:2] == ['cat']
['cat'][-10000:] == ['cat']
另一方面,通过 index 访问某些内容(如果索引不存在,[x]
将失败。这意味着这些失败:
['cat'][1]
['cat'][-2]
您的理解意味着"采取符合以下条件的所有line
:
rstrip
他们不是空的(记住一个空字符串 NOT 一个数字)您可能需要这样:
[line.rstrip() for line in f if not line.rstrip() or line.rstrip()[-1].isdigit()]
这将包括您的空行。
作为澄清,您绝不会从字符串''[-123:]
外部获取值。 ''[-123]
(无冒号)将失败。
答案 1 :(得分:1)
没有隐式连接,切片不会这样做。考虑这个例子:
lines = ['', 'abc', 'xyz123']
for line in lines:
print repr(line.rstrip()[-1:]),
print line.rstrip()[-1:].isdigit()
输出:
'' False
'c' False
'3' True
意外的部分可能是它处理空字符串的方式。空字符串的任何切片都是空字符串,因为越界切片is an empty sequence。然后,str.isdigit
被定义为在空字符串上返回False,因此这些字符串将从列表中过滤掉。