社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

若数 • 6 年前 • 450 次点击  
阅读 13

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

概述

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

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

索引的简单使用

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

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

示例结果:

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

切片的简单使用

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

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

示例结果:

python
str
with
复制代码

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

更酷一点的切片

# 示例字符串
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[:])
复制代码

示例效果:

slice
python str
slice
python str
python str with slice
复制代码

顶层赋值小技巧

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

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

示例结果

[100, 2, 3, 4, 5]
复制代码

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

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

示例结果

[1, 2, 3, 4, 5]
复制代码

更更酷一点的切片

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

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

示例结果:

acegik
kigeca
复制代码

字符串翻转小技巧

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

总结

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

leetcode题例

实现 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() 定义相符。
复制代码

利用切片解题:

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
            
复制代码
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32641
 
450 次点击