小题目大智慧
元旦三天小长假,很多小伙伴肯定都无心学习,想假期好好出去嗨一嗨,但是,放松之余也别忘了学习python哦。不积跬步无以至千里,不积小流无以成江海。做事贵在一个坚持。
今天给大家分享一道实战题目,题目虽小,包含的知识点却很多,希望小伙伴们细细品味。
给定2个字符串s1,s2,判定s2能否给s1做循环移位得到字符串的包含。比如:s1=“AABBCD”,s2=“CDAA”。
这道题看起来很复杂,仔细想想其实每个字母循环移位到最右边,不断的移位,到最后就变成AABBCDAABBCC,然后只要判断一些s2在不在里面就行了。
根据这个思路,编写的代码如下:
defproblem5(s1,s2):
s1 = str("AABBCD")
s2 = str("CDAA")
s3 = s1+s1
if(len(s3)>len(s2)):
print(s3.find(s2))
else:
print(s2.find(s3))
problem5(str("AABBCD"),str("CDAA"))
上面的代码中用到了find()函数,下面我把这个函数详细介绍一下。
Python find()方法主要检测字符串是否包含子字符串str,如果指定beg(开始)和end(结束)范围,则检查是否包含在指定范围内,如果包含子字符串,则返回子字符串开始位置的索引值,否则返回-1。
Find()函数语法是:str.find(str,beg=0,end=len(string))。
str——指定检索的字符串
beg——开始索引,默认为0
end——结束索引,默认字符串的长度
下面举个例子,大家一看就懂了。
Str1=“Hello,python!”
Print(str1.find(‘python’))
Print(str1.find(‘ok’))
输出结果:6
-1
那么,今天既然给大家介绍到移位,索性就给大家介绍用python序列循环移位的3种方法。
方法一:
def demo(lst,k):
temp=lst[:]
for i in range(k):
temp.append(temp.pop(0))
return temp
这个方法优点不言而言,代码直截了当、容易理解,缺点是速度慢,只能实现循环左移。
方法二:
def demo(lst,k):
x=lst[k-1::-1]
y=lst[:k-1:-1]
return list(reversed(x+y))
方法二特点是速度快,并且自适应循环左移(k>0)和右移(k<0),缺点是涉及算法,不易理解。
这个方法编写的代码包含reverse(),简单说一下这个函数的作用,主要用途是反转列表元素的排列顺序。
举个例子便于大家理解。
lst=list(range(20)) #测试用的列表
demo(lst,3) #循环左移3
[3, 4, 5, 6, 7,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2] #输出结果
方法三:
def demo(lst,k):
return list[k:]+list[:k]
这个方法我觉得贼牛逼,把python中的切片发挥的淋漓尽致,速度最快,可同时实现循环左移(k>0)和右移(k<0)。后面我会单独讲一讲切片,我觉得运用切片可以使python工作效率提高,而且代码也比较容易理解。
今天的分享就到这了,通过一道题目就可以延伸出这么多个知识点,所以,果然还是实战是检验理论的唯一方法。如果有写的不到位的地方,欢迎小伙伴们批评指正,也希望可以多和大神交流经验。