Python容易被忽视的实用语法

strip()

 x='  bab  '
 x=x.strip()   
 print('the result is'+x+'.')
 //the result is bab.

strip默认删去前后的空格,如果指明是某个字符,那么strip删除的是开始或者结尾这两个字符(如果有):

x='bab'
x=x.strip('b')   
print('the result is '+x+'.')
//the result is a.

x='  bab  '
x=x.strip('b')   
print('the result is '+x+'.')
//the result is   bab  .

x='ba'
x=x.strip('b')   
print('the result is '+x+'.')
//the result is a.

这个对字符串的操作可以使一些实际场景很好完成,例如Leetcode 58 Length of Last Word
我本身的解决方法是:

if len(s)==0: return 0
pointer=len(s)-1
last_str=''
while pointer>=0:
    if s[pointer]!=' ':
        last_str+=s[pointer]
    elif last_str!='':
        break
    pointer-=1
return len(last_str)

使用了Strip后的算法代码可简化为:

s=s.strip()split(" ")
return len(s[-1])

join()

Join可将多个元素合并连接在一起,成为一个字符串。

myTuple = ("John", "Peter", "Vicky")

x = "#".join(myTuple)

print(x)
//John#Peter#Vicky

很多场景和题目中,对于字符串的变换和操作多变,不同方法的差距的效率很大。比如Leetcode 66 Plus One
我最初的解法是:

if digits[-1]!=9:
    digits[-1]=digits[-1]+1
elif len(digits)==1:
    digits=[1,0]
else:
    digits[-1]+=1
    i=len(digits)-1
    while i>=1 and digits[i]==10:
        digits[i]=0
        digits[i-1]=digits[i-1]+1
        i-=1
    if digits[0]==10:
        digits[0]=0
        digits.insert(0,1)
return digits

虽然被接受了,但是时间效率只超过了5%的Python Submission。。。再思考一遍,其实没有必要对这么多情况分类讨论,可以动态的把这个加一操作看成对数组的整体操作,所以更改代码如下:

carry=1
i=len(digits)-1
while i >=0:
    cur=digits[i]+carry
    digits[i]=cur%10
    carry=cur//10
    if not carry: break
    i-=1

if carry:
    digits.insert(0,1)
return digits

结果只进步了百分之三。。。忽然想到Python对字符串的操作效率更高,所以很多大数问题转换成字符串进行操作都是比较好的做法。于是改进算法的流程如下:

num_list=[str(x) for x in digits]
str_list=''.join(num_list)
integer=int(str_list)
integer+=1
result=map(int,str(integer))
res=[y for y in result]
return res

已经超过了28%的提交运行时间呢!可以说是有大幅提升了吧(bushi)~
可惜目前还没看到讨论区有更快的Python做法,一个说超过了90%的做法也和这个方法类似,但我跑出来就只有30%。不知道是不是我的XP反应太慢了,导致输在了起跑线上哈哈😊

reduce()

reduce(function,sequence)是对sequence实现某种从左到右的function操作。
Leetcode 136

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(lambda x,y: x^y,nums)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值