Python算法(二)

1.列表复制问题

1
2
3
list1=[None,None]
list2=list1*2 -->[None,None,None,None]
list3=[list1]*2 -->[[None,None],[None,None]]

2.求列表第三大的那个值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 求列表第三大的那个值
def thirdMax(list1):
max1 = list1[0]
max2 = list1[1]
max3 = list1[2]

for k in list1:
if k > max1:
max1, max2, max3 = k, max1, max2
elif k > max2:
max2, max3 = k, max2
elif k > max3:
max3 = k
return max3

list1=[1,4,8,5,6,7,9]
thirdMax(list1)

3.台阶问题/斐波那契

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

1
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)

第二种记忆方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def memo(func):
cache = {}
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap


@memo
def fib(i):
if i < 2:
return 1
return fib(i-1) + fib(i-2)

第三种方法

1
2
3
4
5
def fib(n):
a, b = 0, 1
for _ in xrange(n):
a, b = b, a + b
return b

变态台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

1
fib = lambda n: n if n < 2 else 2 * fib(n - 1)

4.去除列表中的重复元素

用集合

1
list(set(l))

用字典

1
2
3
l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()
print l2

用字典并保持顺序

1
2
3
4
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print l2

列表推导式

1
2
3
4
5
6
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]
for i in l1:
if i not in l2:
l2.append(i)

sorted排序并且用列表推导式.

l = [‘b’,’c’,’d’,’b’,’c’,’a’,’a’]
[single.append(i) for i in sorted(l) if i not in single]
print single

5.创建字典的方法

1 直接创建

1
dict = {'name':'earth', 'port':'80'}

2 工厂方法

1
2
3
items=[('name','earth'),('port','80')]
dict2=dict(items)
dict1=dict((['name','earth'],['port','80']))

3 fromkeys()方法

1
2
3
4
5
6
7
8
9
dict1={}.fromkeys(('x','y'),-1)
dict={'x':-1,'y':-1}
dict2={}.fromkeys(('x','y'))
dict2={'x':None, 'y':None}

# 4 zip方法
keys = ['a','b']
values = [1,2]
dict1= dict(zip(keys,values))

6.合并两个有序列表

pop弹出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a = [1,2,3,7]
b = [3,4,5]

def merge_sortedlist(a,b):
c = []
while a and b:
if a[0] >= b[0]:
c.append(b.pop(0))
else:
c.append(a.pop(0))
while a:
c.append(a.pop(0))
while b:
c.append(b.pop(0))
return c
print merge_sortedlist(a,b)
坚持原创技术分享,您的支持将鼓励我继续创作!