我想从字符串的第三个字符开始获取一个新的字符串,直到末尾,例如myString[2:end]
。如果省略第二部分表示“到末尾”,那么如果省略第一部分,它是否从开头开始?
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'
Python将这个概念称为“切片”,它不仅适用于字符串。在这里查看全面介绍。
仅为完整性,因为没有人提到它。 数组切片的第三个参数是步长。 所以反转一个字符串就像这样简单:
some_string[::-1]
或者选择备选字符:
"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"
能够在字符串中前进和后退的能力与从开头或结尾进行数组切片的能力保持一致。Substr() 通常(即 PHP 和 Perl)的工作方式如下:
s = Substr(s, beginning, LENGTH)
所以参数是 beginning
和 LENGTH
。
但是Python的行为不同,它期望的是起始位置和结束位置加一。对于初学者来说,这很难发现。因此,正确替换 Substr(s, beginning, LENGTH) 的方法是:
s = s[ beginning : beginning + LENGTH]
s[beginning:][:length]
。 - victortv(起始位置,长度)
,另一种是 (起始位置,结束位置)
。Python 中的 (起始位置, 结束位置+1)
确实不太常见,但与 Python 中其他操作的方式非常相似。 - AndyBMyString[a:b]
可以返回从索引a到(b-1)的子字符串。这里似乎缺少一个例子:完全(浅层)复制。
>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>
这是一种常见的习语,用于创建序列类型(而不是内部字符串)的副本,[:]
。浅复制列表,请参见Python list slice syntax used for no obvious reason。
a=b
应该足够了。 - bfontaine[:]
根本不会复制。虽然当mysequence
是像str
,tuple
,bytes
(Py3)或unicode
(Py2)这样的不可变类型时,mysequence[:]
大多是无害的,但是a = b[:]
等同于a = b
,它只是浪费一点时间来分派切片字节码,对象通过返回自身来响应它,因为浅复制是毫无意义的,除了对象标识测试外,它等同于只返回对自己的另一个引用。 - ShadowRangers[:]
根本不会复制:s ='abc'; s0 = s [:]; assert s is s0
。是的,在Python中,复制列表的惯用方法是使用切片,直到列表有了list.copy
,但是对于不可变类型的完整切片没有理由进行复制,因为它不能被更改,因此可能只有一个存在于内存中,我们不应该浪费时间复制它。由于这个答案是错误的,而且甚至没有回答问题 - 是否应该将其删除? - Russia Must Remove PutinmyString[2:end]
?」」None
赋值或者绑定到名称end
上,这个方法实际上是可行的。」>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'
切片符号有三个重要参数:
在没有给出时它们的默认值为None
- 但我们可以明确地传递它们:
>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'
>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'
>>> myString[::-1]
'0987654321'
我在解释切片符号问题中详细解释了切片符号。
我想对讨论添加两点:
您可以使用 None
代替空格来指定“从开头”或“到结尾”:
'abcde'[2:None] == 'abcde'[2:] == 'cde'
这在函数中特别有帮助,因为你无法将空格作为参数提供:
def substring(s, start, end):
"""Remove `start` characters from the beginning and `end`
characters from the end of string `s`.
Examples
--------
>>> substring('abcde', 0, 3)
'abc'
>>> substring('abcde', 1, None)
'bcde'
"""
return s[start:end]
Python有 切片 对象:
idx = slice(2, None)
'abcde'[idx] == 'abcde'[2:] == 'cde'
除了 "end" 之外,你的理解是正确的。这被称为切片表示法。你的例子应该写成:
new_sub_string = myString[2:]
如果省略第二个参数,则隐式为字符串的末尾。
text = "StackOverflow"
#using python slicing, you can get different subsets of the above string
#reverse of the string
text[::-1] # 'wolfrevOkcatS'
#fist five characters
text[:5] # Stack'
#last five characters
text[-5:] # 'rflow'
#3rd character to the fifth character
text[2:5] # 'ack'
#characters at even positions
text[1::2] # 'tcOefo'
acct = myString[6:][:9]
。myString[2:][:999999]
它有效 - 没有引发错误,也没有出现默认的"字符串填充"。
myString[offset:][:length]
,你只需要使用 myString[offset:][:]
即可。 - victortv