有没有一种方法可以在Python中为字符串加上字符串,以从第三个字符到字符串的末尾获取新的字符串?
也许喜欢myString[2:end]
吗?
如果离开第二部分意味着“直到最后”,而如果离开第一部分,它是否从头开始?
有没有一种方法可以在Python中为字符串加上字符串,以从第三个字符到字符串的末尾获取新的字符串?
也许喜欢myString[2:end]
吗?
如果离开第二部分意味着“直到最后”,而如果离开第一部分,它是否从头开始?
Answers:
只是为了完整性,没有其他人提到过它。数组切片的第三个参数是一个步骤。因此,反转字符串很简单:
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]
这里似乎缺少一个示例:完整(浅)副本。
>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>
这是用于创建序列类型(而非插入字符串)的副本的常见用法[:]
。浅表复制列表,请参阅无明显原因的Python列表切片语法。
a=b
应该足够了。
[:]
在不可变类型上根本不会复制。而mysequence[:]
当大部分是无害的mysequence
是不可变的类型一样str
,tuple
,bytes
(PY 3)或unicode
(的Py2),a = b[:]
等同于a = b
,它只是浪费一点时间调度切片字节代码,对象响应通过返回自身,因为它是毫无意义的浅拷贝时,除了对象身份测试外,它等效于仅返回另一个对自己不变的自我的引用。
s[:]
根本不会制作副本:s = 'abc'; s0 = s[:]; assert s is s0
。是的,这是在Python中复制列表直到列表得到的惯用方式list.copy
,但是不可变类型的完整切片没有理由进行复制,因为它无法更改,因此在内存中可能只有一个,并且我们不应该浪费时间复制它。由于此答案是错误的,甚至无法回答问题 -应该删除它吗?
有没有一种方法可以在Python中为字符串加上字符串,以从第3个字符到字符串的末尾获取新的字符串?
也许喜欢
myString[2:end]
吗?
是的,如果您将名称()分配或绑定end
到常量单例,这实际上是可行的None
:
>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'
切片符号具有3个重要参数:
如果未指定,则默认为None
-但我们可以显式传递它们:
>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'
如果离开第二部分意味着“直到最后”,那么如果离开第一部分,它是否从头开始?
是的,例如:
>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'
请注意,我们在切片中包括了开始,但是我们仅上至(不包括)停止。
当step为时None
,默认情况下切片将1
用于该步骤。如果您使用负整数执行操作,则Python足够聪明,可以从头到尾进行操作。
>>> 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'
如果myString包含以偏移量6开始且长度为9的帐号,则可以通过以下方式提取该帐号: acct = myString[6:][:9]
。
如果OP接受,他们可能想尝试一下,
myString[2:][:999999]
它可以正常工作-不会引发任何错误,也不会发生默认的“字符串填充”。
myString[offset:][:length]
在OP的情况下使用此方法,则可以使用myString[offset:][:]
也许我错过了,但是在此页面上找不到原始问题的完整答案,因为这里没有进一步讨论变量。所以我不得不继续寻找。
由于尚未允许我发表评论,因此让我在这里添加我的结论。我确定访问此页面时,我不是唯一对此感兴趣的人:
>>>myString = 'Hello World'
>>>end = 5
>>>myString[2:end]
'llo'
如果您离开第一部分,您会得到
>>>myString[:end]
'Hello'
如果在中间也留下了:,则会得到最简单的子字符串,它是第5个字符(计数从0开始,因此在这种情况下为空白):
>>>myString[end]
' '
好吧,我遇到了需要将PHP脚本转换为Python的情况,并且它有许多用法substr(string, beginning, LENGTH)
。
如果选择Python,string[beginning:end]
则必须计算大量的结束索引,因此更简单的方法是使用string[beginning:][:length]
,这为我省去了很多麻烦。
使用硬编码的索引本身可能是一团糟。
为了避免这种情况,Python提供了一个内置对象slice()
。
string = "my company has 1000$ on profit, but I lost 500$ gambling."
如果我们想知道我剩下多少钱。
正常解决方案:
final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500
使用切片:
EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500
使用切片可以获得可读性。