前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3切片使用方法及一些技巧介绍+leetcode题例

python3切片使用方法及一些技巧介绍+leetcode题例

作者头像
一墨编程学习
发布2019-05-17 12:06:12
6350
发布2019-05-17 12:06:12
举报

在Python中,字符串是定义为字符的有序集合,即我们可以像使用列表一样在字符串中自由翱翔-使用索引和切片操作字符串,比如通过指定的索引获取字符串某个位置的字符。

代码语言:javascript
复制
# 示例字符串
s = 'python str with slice'

索引的简单使用

在Python中字符串的索引可以是正数,正数即从左向右索引,索引从0开始,也可以是负数,负数即从右向左开始索引,索引从-1开始。如果超出了正负的索引范围,则会抛出异常

代码语言:javascript
复制
# 即从左边获取第一个偏移位置的字符
print(s[0])
# 即从左边获取第一个偏移位置的字符
print(s[-1])
# 即从左边获取第三个偏移位置的字符
print(s[4])
try:
    # 尝试不存在于s的索引
    print(s[1000])
except:
    print('IndexError: string index out of range')

示例结果:

代码语言:javascript
复制
p
e
o
IndexError: string index out of range

切片的简单使用

切片,顾名思义即将一个有序序列切出一片,即从一个完整的字符串中取出一部分字符串,而怎么取? 这就取决于我们怎么利用索引进行切片了:

代码语言:javascript
复制
s = 'python str with slice'
# 获取从偏移为1,直到但不包括偏移为6的元素
print(s[0:6])
# 获取从偏移为7,直到但不包括偏移为10的元素
print(s[7:10])
# 获取从偏移为11,直到但不包括偏移为-6的元素
print(s[11:-6])

示例结果:

代码语言:javascript
复制
python
str
with

通过上面的切片效果,我们可以看到切片的基本使用,即通过两个用冒号隔开的索引完成“切片”操作,并返回新的字符串(记住,就算只“切”了一个字符,在Python中单个字符也是作为字符串的存在,这和类C中是不一样的)

更酷一点的切片

代码语言:javascript
复制
# 示例字符串
s = 'python str with slice'
# 获取偏移为16直到末尾的元素,等价于获取偏移为16直到但不包括偏移为序列长度的元素
print(s[16:])
# 获取从偏移为0,直到但不包含偏移为11的元素
print(s[:11])
# 获取偏移为-5直到末尾的元素,等价于获取偏移为16直到但不包括偏移为序列长度的元素
print(s[-5:])
# 获取从偏移为0,直到但不包含偏移为-11的元素
print(s[:-11])
# 获取从偏移为0,知道末尾的元素,实现了有效的底层s复制。
print(s[:])

示例效果:

代码语言:javascript
复制
slice
python str
slice
python str
python str with slice
顶层赋值小技巧

对于最后一个示例,即s[:],对于可变对象的复制是很有用处的,比如列表,当我们想要复制列表时:

代码语言:javascript
复制
ls1 = [1, 2, 3, 4, 5]
ls2 = ls1
ls2[0] = 100
print(ls1)

示例结果

代码语言:javascript
复制
[100, 2, 3, 4, 5]

我们看到运行结果,对于可变对象的复制,通过ls2 = ls1其实类似C中将指向ls1的指针赋值给ls2,即还是指向了同一内存空间,所以在操作ls2时,ls1也同时发生了变化,本质就是在操作同一内存空间 而通过s[:]可以实现新的内存分配,完整的赋值一份新的数据,使ls2指向新的内存空间:

代码语言:javascript
复制
ls1 = [1, 2, 3, 4, 5]
ls2 = ls1[:]
ls2[0] = 100
print(ls1)

示例结果

代码语言:javascript
复制
[1, 2, 3, 4, 5]

更更酷一点的切片

在切片的使用中还可以再添加一个可选择的索引参数:

代码语言:javascript
复制
s = 'abcdefghijk'
# 偏移从0开始,直到不含偏移量为11,每隔2个元素索引一次构成最终的新字符串
print(s[:11:2])
# 偏移从11开始,直到不含偏移量为0,每隔2个元素索引一次构成最终的新字符串
print(s[11::-2])
# 即从右向左,每隔一个元素索引一次,效果即翻转字符串
print(s[::-1])

示例结果:

代码语言:javascript
复制
acegik
kigeca
字符串翻转小技巧

当我们想要翻转一个字符串时会怎么做? 用循环? reverse? 栈? reduce? 使用s[::-1]即可完成字符串翻转的操作。

总结

切片在Python中的使用实在太频繁,且用起来非常顺手,所以不得不提出来说说,比如在读取文本中的行时,需要清除每行的换行符直接line[:-1],还有比如在leetcode 有一题:

leetcode题例

代码语言:javascript
复制
实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
复制代码

利用切片解题:

代码语言:javascript
复制
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle:
            length_h = len(haystack)
            length_n = len(needle)
            for i in range(length_h):
                if haystack[i:i+length_n] == needle:
                    return i
            return -1
        else:
            return 0
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引的简单使用
  • 切片的简单使用
  • 更酷一点的切片
    • 顶层赋值小技巧
    • 更更酷一点的切片
      • 字符串翻转小技巧
      • 总结
      • leetcode题例
      • 利用切片解题:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档