lb5645284 发表于 2018-8-10 13:19:47

Python第四周 学习笔记(2)

直接插入排序:


[*]在未排序序列中,构建一个子排序序列,直至全部数据排序完成
[*]将待排序的数,插入到已经排序的序列中合适的位置
[*]增加一个哨兵,放入待比较值,让它和后面已经排好序的序列比较,找到合适的插入点  方法一:
  

def insertion_sort(lst):  
count_swap = 0
  
count_iter = 0
  
for i in range(1, len(lst)):
  temp = lst
  j = i - 1
  count_iter += 1
  while j >= 0 and temp < lst:
  lst = lst
  j -= 1
  count_swap += 1
  lst = temp
  
return lst, count_swap, count_iter

  方法二:
  

lst =   
nums = + lst
  
count_swap = 0
  
count_iter = 0
  
length = len(nums)
  
for i in range(2,length):
  nums = nums
  j = i - 1
  count_iter += 1
  while nums>nums:
  nums = nums
  j -= 1
  count_swap +=1
  nums = nums
  
print(nums, count_swap, count_iter)
  


[*]时间复杂度O(n**2)
[*]稳定排序算法
[*]使用在小规模数据比较
[*]优化点:如果比较操作代价大的话,可采用二分法查找,即二分查找插入排序
习题解析

1、求和
  对下面集合中随机取数字,要求取出的数字是3的倍数但不能是4的倍数,成功取到10个数字并对取到的所有数字求和输出
  {5,10,3,8,6,10,9,15,24,30,27,48,24}
  

lst = {5,10,3,8,6,10,9,15,24,30,27,48,24}  
result = []
  
import random
  
while True:
  temp = random.sample(lst, 1)
  if temp % 3 == 0 and temp % 4 != 0:
  result.append(temp)
  if len(result) >= 10:
  break
  
print(result, sum(result))
  

2、选取文件
  选出含有ftp的链接,且文件类型是gz或者xz的文件,要求打印其文件名,文件名升序排列
  'ftp://ftp.astron.com/pub/file/file-5.14.tar.gz',
  'ftp://ftp.gmplib.org/pub/gmp-5.1.2/gmp-5.1.2.tar.xz',
  'ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2',
  'http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration//iana-etc/iana-etc-2.30.tar.bz2',
  'http://anduin.linuxfromscratch.org/sources/other/udev-lfs-205-1.tar.bz2',
  'http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.4.tar.gz',
  'http://download.savannah.gnu.org/releases/man-db/man-db-2.6.5.tar.xz',
  'http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2',
  'http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.5.tar.gz',
  'http://mirror.hust.edu.cn/gnu/autoconf/autoconf-2.69.tar.xz',
  'http://mirror.hust.edu.cn/gnu/automake/automake-1.14.tar.xz'
  

lst = [  
'ftp://ftp.astron.com/pub/file/file-5.14.tar.gz',
  
'ftp://ftp.gmplib.org/pub/gmp-5.1.2/gmp-5.1.2.tar.xz',
  
'ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2',
  
'http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration//iana-etc/iana-etc-2.30.tar.bz2',
  
'http://anduin.linuxfromscratch.org/sources/other/udev-lfs-205-1.tar.bz2',
  
'http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.4.tar.gz',
  
'http://download.savannah.gnu.org/releases/man-db/man-db-2.6.5.tar.xz',
  
'http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2',
  
'http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.5.tar.gz',
  
'http://mirror.hust.edu.cn/gnu/autoconf/autoconf-2.69.tar.xz',
  
'http://mirror.hust.edu.cn/gnu/automake/automake-1.14.tar.xz'
  
]
  

  
result = for i in lst if i.find('ftp') != - 1 and (i.rpartition('.')[- 1] in ['gz', 'xz'])]
  
result.sort()
  
print(result)
  

3、转置矩阵
  随机生成4*4的方阵所有数据,打印出来
  在此矩阵上求转置矩阵并打印出来
  

import random  
matrix = []
  
for _ in range(4):
  temp = []
  for __ in range(4):
  temp.append(random.randint(0, 100))
  matrix.append(temp)
  
) for i in range(4)]
  
print('---------------------------------')
  
for i in range(len(matrix)):
  for j in range(i, len(matrix)):
  if i == j:
  continue
  matrix, matrix = matrix, matrix
  
) for i in range(4)]
  

4、生成随机的20个ID
  ID格式要求:
  时间戳_三位随机数字号码_8位随机小写字母
  1506571959_089_xxkeabef
  datetime.datetime.now().timestamp() 返回的是时间戳,但是带微秒
  

import random  
import datetime
  
lst=+'_'+'{:>03}'.format(str(random.randint(0, 100)))+'_'+''.join('abcdefghijklmnopqrstuvwxyz' for _ in range(8)) for _ in range(20)]
  
print(lst)
  

5、去除重复数字
  
  数字在上面的列表中,要得到一个没有重复数字的升序列表
  要求使用2种方法完成:
  1、使用集合完成去重
  2、只使用列表完成去重,不使用set或者dict(有能力选做)
  

lst =   
result=sorted(list(set(lst)))
  
print(result)
  

lst =   
result = []
  
for i in lst:
  if i in result:
  continue
  result.append(i)
  
print(sorted(result))
  

6、排序
  375 3.5 6 20 9 -20 68
  对上面的数字实现冒泡排序
  

lst =   
length = len(lst)
  
for i in range(length - 1):
  flag = False
  for j in range(i + 1,length):
  if lst > lst:
  flag = True
  lst, lst = lst, lst
  if not flag:
  break
  
print(lst)
  

7、第6题实现选择排序
  

lst =   
length = len(lst)
  
for i in range(length // 2):
  maxindex = i
  minindex = length - i - 1
  minorigin = length - i - 1
  for j in range(i + 1,length - i):
  if lst > lst:
  maxindex = j
  if lst < lst:
  minindex = length - j - 1
  if i != maxindex:
  lst, lst = lst, lst
  if minindex == i:
  minindex = maxindex
  if minorigin != minindex:
  lst, lst = lst, lst
  
print(lst)
  

8、判断密码强弱
  要求密码必须由 10-15位 指定字符组成:
  十进制数字
  大写字母
  小写字母
  下划线
  要求四种类型的字符都要出现才算合法的强密码
  例如:Aatb32_67mnq,其中包含大写字母、小写字母、数字和下划线,是合格的强密码
  

dict_lalpha =   
dict_ualpha =
  
dict_digit =
  
print('{}\n{}\n{}'.format(dict_digit,dict_ualpha,dict_lalpha))
  
a='Aatb32_67mnq'
  
#dic={k:0 for v,k in enumerate(a)}
  

  
flag_l = False
  
flag_u = False
  
flag_d = False
  
if len(a) <10 or len(a)>15:
  print('Wrong')
  
elif a.find('_') == -1:
  print('Weak')
  
else:
  for i in a:
  if i in dict_lalpha:
  flag_l = True
  

  if i in dict_ualpha:
  flag_u = True
  

  if i in dict_digit:
  flag_d = True
  

  if flag_l and flag_d and flag_u:
  print('Strong')
  else:
  print('Weak')
  

9、日志统计
  状态200的不同jsp页面访问次数
  统计不同类型文件的访问次数,文件类型有静态类(js、css)、图片类(jpg、jpeg、gif、png)、动态类(action、jsp、do)
  日志如下:
  

lst=[  
'116.226.208.136 - - "GET /js/check.js HTTP/1.1" 304 -',
  
'59.53.22.67 - - "GET /jquery/jquery.datepick.css HTTP/1.1" 304 -',
  
'117.93.56.165 - - "GET /jquery/jquery-1.4.2.js HTTP/1.1" 304 -',
  
'106.39.189.200 - - "GET /jquery/jquery.datepick.js HTTP/1.1" 304 -',
  
'219.146.71.17 - - "GET /jquery/jquery.datepick-zh-CN.js HTTP/1.1" 304 -',
  
'111.11.83.162 - - "GET /images/shim.gif HTTP/1.1" 304 -',
  
'117.93.56.165 - - "GET /images/button_ok.gif HTTP/1.1" 304 -',
  
'111.206.221.200 - - "GET /images/button_cancel.gif HTTP/1.1" 304 -',
  
'112.80.144.85 - - "GET /user/list.jsp HTTP/1.1" 200 7644',
  
'117.148.200.56 - - "GET /images/i_edit.gif HTTP/1.1" 304 -',
  
'183.12.49.80 - - "GET /images/i_del.gif HTTP/1.1" 304 -',
  
'175.19.57.147 - - "GET /images/button_view.gif HTTP/1.1" 304 -',
  
'117.136.63.218 - - "GET /user/list.jsp HTTP/1.1" 200 7644',
  
'157.55.39.102 - - "GET /login.jsp HTTP/1.1" 200 2607',
  
'111.206.221.68 - - "POST /user_login.action HTTP/1.1" 200 2809',
  
'117.93.56.165 - - "POST /user_login.action HTTP/1.1" 302 -',
  
'223.98.218.205 - - "GET /login/home.jsp HTTP/1.1" 200 743',
  
'117.136.97.78 - - "GET /login/welcome.jsp HTTP/1.1" 200 1142',
  
'111.206.221.68 - - "GET /login.jsp HTTP/1.1" 200 803',
  
'117.93.56.165 - - "GET /login/top.jsp HTTP/1.1" 200 2052',
  
'111.206.221.68 - - "GET /login.jsp HTTP/1.1" 200 1113'
  
]
  
diff = {'static': 0, 'pic' : 0, 'dynamic' : 0}
  
result={}
  
temp=[]
  
for i in lst:
  status = i.rpartition('"')[-1].strip().rpartition(' ')
  name = i.partition('"')[-1].partition('"').split(' ').rpartition('/')[-1]
  if status == '200' and name.rpartition('.')[-1] == 'jsp':
  if name in temp:
  result += 1
  else:
  result = 1
  temp.append(name)
  

  if name.rpartition('.')[-1] in ('js','css'):
  diff['static']+=1
  elif name.rpartition('.')[-1] in ('jpg','jpeg','gif','png'):
  diff['pic']+=1
  elif name.rpartition('.')[-1] in ('action','jsp','do'):
  diff['dynamic']+=1
  
print(result)
  
print(diff)
  

10、打印矩阵外圈
  1   2   6   7
  3   5   8   13
  4   9   1214
  10111516
  打印顺序为1,2,6,7,13,14,16,15,11,10,4,3
  

from copy import deepcopy  
matrix = [,,,]
  
reverse_matrix = deepcopy(matrix)
  
for i in range(len(reverse_matrix)):
  for j in range(i, len(reverse_matrix)):
  if i == j:
  continue
  reverse_matrix, reverse_matrix = reverse_matrix, reverse_matrix
  
reverse_matrix.reverse()
  

  
result=matrix+(reverse_matrix)+((matrix)[::-1])+((reverse_matrix)[::-1])
  
result.pop()
  
print(result)
  

11、挑战题:
  打印矩阵元素
  1   2   6   7
  3   5   8   13
  4   9   1214
  10111516
  之字形打印结果为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
  

matrix = [,,,]  
result=[]
  
length=len(matrix)
  

  
for i in range(length * 2 - 1):
  k = 0
  temp=[]
  if i <= length-1:
  for j in range(i+1):
  k = i - j
  temp.append(matrix)
  if i % 2 ==1:
  temp.reverse()
  if i > length-1:
  for j in range(length -1, i - length, -1):
  k = i - j
  temp.append(matrix)
  if i % 2 != 1:
  temp.reverse()
  result += temp
  
print(result)
  

12、编写一个函数,能够接受至少2个参数,返回最小值和最大值
  

def min_max(x,y,*args):  max=0
  min=0
  if x > y:
  max=x
  min = y
  else:
  max = y
  min = x
  for i in args:
  if i > max:
  max = i
  if i < min:
  min= i
  return {'min':min, 'max':max}
  

13、编写一个函数,接受一个参数n,n为正整数,左打印方式。要求数字必须对齐
  

def triangle(n):  length = 3 * n
  for i in range(1,n + 1):
  line = []
  for j in range(1,n + 1):
  line.append( str(j) if i >= j else ' ')
  print('{:>{}}'.format(' '.join(line[::-1]),length))
  

def triangle(n):  tail = ' '.join(str(i) for i in range(n, 0, -1))
  width = len(tail)
  for i in range(1, n):

  print('{:>{}}'.format(' '.join(str(j) for j in range(i, 0, -1)),>  print(tail)
  

14、编写一个函数,接受一个参数n,n为正整数,右打印方式。要求数字必须对齐
  

def triangle(n):  length = 3 * n
  for i in range(1,n + 1):
  line = []
  for j in range(1,n + 1):
  line.append(str(j) if i<= n - j + 1 else ' ')
  print('{:>{}}'.format(' '.join(line[::-1]),length))
  

def triangle(n):  head = ' '.join(str(i) for i in range(n, 0, -1))
  width = len(head)
  print(head)
  for i in range(len(head)):
  if head == ' ':
  print(' ' * i, head)
  

15、求n的阶乘(使用递归)
  

def fac(n):  if n == 1:
  return 1
  return n * fac(n - 1)
  

16、将一个数逆序放入列表中(使用递归)
  

def reverse(x, lst = None):  if lst is None:
  lst = []
  x, y = divmod(n, 10)
  lst.append(y)
  if x == 0:
  return lst
  return reverse(x, lst)
  

17、猴子吃桃(使用递归)
  

def peach(days= 10):  if days == 1:
  return 1
  return (peach(days - 1) + 1) * 2
页: [1]
查看完整版本: Python第四周 学习笔记(2)