切片跨越字符串边界?

时间:2018-04-02 13:25:02

标签: python string python-2.7 list-comprehension slice

请解释:

>>> [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:]切片似乎越过了许多字符串的边界。

2 个答案:

答案 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,因此这些字符串将从列表中过滤掉。

相关问题