@sevenup233
2018-04-01T13:05:13.000000Z
字数 1723
阅读 641
CodeWar
题目:求公因数(不算1和自己),素数返回‘xx is prime’
初见:
def divisors(integer):
div = []
for i in range(integer):
a = i + 1
if integer % a == 0:
div.append(a)
div.pop()
div.pop(0)
if div == []:
return ('%s is prime'%(integer))
else:
return(div)
优化:
def divisors(integer):
return [a for a in range(2,integer) if integer % a == 0 ] or str('%s is prime'%(integer))
总结:%是除后余数,a % 2 == 0 常用判断a是偶数,‘%s’%()可在字符串引用变量
题目:取一段string的中位数
初见:
def get_middle(s):
r=int(len(s)/2-1)
if len(s) % 2 == 0:
l=s[r:r+2]
else:
l=s[r+1]
return l
优化:
def get_middle(s):
return s[(len(s)-1)//2:len(s)//2+1]
总结:int是向下取整,/有一个浮点不能直接用来切片,//无浮点向下取整,round四舍五入,没有直接向下取整
题目:剔除 list a 中所有 list b 的元素
初见:
def array_diff(a, b):
c = []
d = []
# for j in a:
# if not j in d:
# for k in b:
# if k == j:
# d.append(k)
for j in a:
if j not in d:
c.append(j)
return(c)
优化:
def array_diff(a, b):
return [c for c in a if c not in b]
总结:想烦了,标注段完全没用,没必要设一个装垃圾的d,多考虑逆向思维
题目:123变成‘100+20+3’这样
初见:
def expanded_form(num):
a=str(num)
n=len(a)
d=str()
for i in range(n):
if a[i] != str(0):
d += str(int(a[i])*10**(n-i-1)) + ' + '
d = d[:-3]
return(d)
优化:
def expanded_form(num):
return " + ".join([str(int(d) * 10**p) for p, d in enumerate(str(num)[::-1]) if d != "0"][::-1])
总结:
enumarate和两个逆序用的太妙了,还有join的中间插入可以省去一个末尾判断
#关于enumuerate()
a = ['a', 'b', 'c', 'd']
b = list(enumerate(a)) #[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
c = dict(enumerate(a)) #{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
d = list(enumerate(a,10)) #[(10, 'a'), (11, 'b'), (12, 'c'), (13, 'd')]
for i,j in enumerate(a):
print(i,a[i],j)
#0 a a
#1 b b
#2 c c
#3 d d
题目:确保括号都闭合
初见:
def valid_parentheses(string):
l = 0
n = len(string)
for i in range(n):
if l == 0 and string[i] == ')':
return False
else:
if string[i] == '(':
l += 1
if string[i] == ')':
l -= 1
if l == 0:
return True
else:
return False
优化:
def valid_parentheses(s):
b = 0
for c in s:
if c == '(':
b += 1
if c == ')':
b -= 1
if b < 0:
return False
return b == 0
总结:首先可以直接for i in string,这样不用通过len和string[i]来取位;然后也不用进行开头是),在一次循环结束时用l<0验证就可以了;最后就是输出一个boolean自己判断就可以了,不用手动T/F