互联网架构运维、Python运维开发

Python运维开发:02 序列

列表特征

  • 有序
  • 编号,又名索引、下标,可以通过编号访问元素
  • 可遍历
  • 可追加/可插入
  • 可删除/可以弹出
  • 可修改
  • 长度不定

列表定义

    如,nums = [1, 2, 3, 4, 5]

  • 使用中括号包含
  • 每个元素之间使用逗号分隔
  • 可包含任意数据类型,如[1 ,2 , 3, 4, 5] 、[1, 'abc', True, False]

 访问与修改列表

    访问

        列表是有序的数据集,通过列表名[索引]的方式访问列表中的元素

   索引编号

        1)从左向右依次为 0, 1, 2, 3, ... n -1

   2)从右向左依次为 -1, -2, -3, ..., -n

   3)访问元素的索引必须存在,否则报错

>>> l = [1, 2, 3, 4]
>>> l[0]
1
>>> l[3]
4

     元素修改

        1)通过直接给列表名[索引]修改对应索引位置的值

        2)修改元素的索引必须存在,否则报错

>>> l[1] = 'abc'
>>> l
[1, 'abc', 3, 4]
>>> l[6] = '88'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list assignment index out of range

 遍历列表

    使用for访问列表中所有的元素

>>> nums = [1, 2, 3, 4]
>>> for num in nums:
...     print(num)
...     
1
2
3
4

     类型转换

        1)可以通过函数list将其他可遍历的类型转化为列表

>>> list('abcde')
['a', 'b', 'c', 'd', 'e']

         2)使用range函数快速创建序列

            range(end) 创建从 0到end-1 的连续整数组成的序列

            range(start, end) 创建从 start到 end-1 的连续整数组成的序列

            range(start, end, step) 创建从 start 到 end-1 的每隔step个整数组成的序列

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(0, 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(2,10))
[2, 3, 4, 5, 6, 7, 8, 9]

None类型

>>> a = None
>>> a
>>> b = 1
>>> b
1
>>> type(b)
<class 'int'>
>>> type(a)
<class 'NoneType'>
>>> print(a)
None
>>> 
>>> a is None
True
>>> a is not None
False
>>> b is not None
True

列表常见操作

len 获取list元素的数量

max 获取list中元素最大值

min 获取list中元素最小值

判断元素是否在list中存储

>>> nums = [1, 2, 3, 4]
>>> len(nums)
4
>>> max(nums)
4
>>> min(nums)
1
>>> 1 in nums
True
>>> 2 not in nums
False

 删除列表中元素

    根据索引删除list中对应元素

>>> del nums[0]
>>> nums
[2, 3, 4]

列表运算

    加(+):必须是两个list相加,相当于2个list拼接合并

    乘(*):必须一个为整数,相当于将list 重复 n 次

>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

列表函数
append 添加元素到list最右侧
clear 清空list中的元素
copy 复制list中的所有元素到新list中并返回
count 计算list中存在相同元素的数量
extend 将一个可遍历数据中的所有元素追加到list后
index 获取元素在list中的位置
insert 在list指定位置添加元素
pop 弹出list中指定位置的元素(默认最右侧)
remove 移除list中指定的元素
reverse对list中元素进行反转
sort 对list中元素进行排序

元组函数
count 计算tuple中存在相同元素的数量
index 获取元素在tuple中的位置

练习题】

1、找出 nums=[6, 11, 7, 9, 4, 2, 1]中最大的数字

#!/bin/bin/env python
# -*- coding: utf-8 -*-
# __auhtor__: will_xue
# Date: 2018-12-23
# Email: xuegqcto@aliyun.com

#!/bin/bin/env python
# -*- coding: utf-8 -*-
# __auhtor__: will_xue
# Date: 2018-12-23
# Email: xuegqcto@aliyun.com

# 找出 nums=[6, 11, 7, 9, 4, 2, 1]中最大的数字

'''
nums = [6, 11, 7, 9, 4, 2, 1]

max = nums[0]

for num in nums:
    if num > max:
        max = num

print('最大数是:', max)

#=================================================
#  写法二,使用了 list.index()方法,列表赋值给max

max = 0

for x in nums:
    if x > max:
        i = nums.index(x)
        max = nums[i]

print('最大数是:', max)

#=================================================
'''
nums = [-1, -9, -7, -6, -10, -11]

max = None

for num in nums:
    if max is None:
        max = num
    elif num > max:
        max = num

print('最大数是:', max)

 2、移动nums中最大的数字到最后
提示:
从右到左依次两两比较,如果前面比后面大,则交换位置
第1次: 6,11比较,前面小,不交换[6, 11, 7, 9, 4, 2, 1]
第2次: 11, 7比较,前面大,交换[6, 7, 11, 9, 4, 2, 1]
第3次: 11, 9比较,前面大,交换[6, 7, 9, 11, 4, 2, 1]
第4次: 11, 4比较,前面大,交换[6, 7, 9, 4, 11, 2, 1]
第5次: 11, 2比较,前面大,交换[6, 7, 9, 4, 2, 11, 1]
第6次: 11, 1比较,前面大,交换[6, 7, 9, 4, 2, 1, 11]
交换元素
tmp = a; a=b; b = tmp;
a, b = b, a

3、Todolist
提示用户输入do或者任务(非do)
如果用户输入任务,则添加到list中
如果用户输入do,当任务为空时则打印无任务并退出,否则从list中根据先进先出原则打印任务
4、获取两个list中相同的元素到第三个列表中
nums_1 = [1, 2, 3, 4, 5, 3, 10, 11]
nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]

#!/bin/bin/env python
# -*- coding: utf-8 -*-
# __auhtor__: will_xue
# Date: 2018-12-23
# Email: xuegqcto@aliyun.com

'''
获取两个list中相同的元素到第三个列表中
nums_1 = [1, 2, 3, 4, 5, 3, 10, 11]
nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
'''

nums_1 = [1, 2, 3, 4, 5, 3, 10, 11]
nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
nums_3 = []

for num in nums_1:
    if (num in  nums_2) and (num not in  nums_3):
        nums_3.append(num)

print(nums_3)

 结果:

[1, 2, 3, 4, 5]
5、保证第二个练习中第三个列表中元素不重复

6、用户管理
让用户在控制台上输入”find/list/add/delete/update/exit”格式字符串
如果输入add,则让用户继续输入用户名、年龄、联系方式等数据, 将用户数据(用户名, 年龄,联系方式),放入list中存储,在放入list之前检查用户名不重复,如果重复,则提示用户已存在
如果输入delete,则让用户输入”用户名”字符串,根据用户名查找list中数据,若存在数据则将该数据移除,若用户数据不存在,则提示不存在

7、用户管理
如果输入update,则让用户分别输入用户名、年龄、联系方式等数据,根据用户名查找list中数据,若存在数据则将改数据更新为新的(用户名, 年龄,联系方式),若用户数据不存在,则提示不存在
如果用户输入find,则让用户输入”用户名” ,根据用户名查找list中数据用户名等于字符串的用户信息,并打印
如果用户输入list,则打印所有用户信息
打印用户第一个行数据为用户信息描述,从第二行开始为用户数据
如果用户输入exit,则打印退出程序,并退出

【作业】
1、插入排序

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Auth : xuegqcto@aliyun.com

# 定义一个列表
nums = [11, 9, 22, 5, 30, 28, 15]

# 第一层for 循环用于控制 len(nums)次
for num in nums:

    # 第二次for 循环用于前后比较,最终将列表最大值放到列表的最后。
    # 循环len(nums)次,将变为有顺序的列表
    for i in range(len(nums)-1):
        if nums[i] > nums[i+1]:
            nums[i],nums[i+1] = nums[i+1], nums[i]

print(nums)

 2、二分查找
提示:mid = (high + low) / 2
            mid为索引

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Auth : xuegqcto@aliyun.com

'''
描述:二分查找又称折半查找,它是一种效率较高的查找方法。

二分查找要求:
(1)必须采用顺序存储结构
(2).必须按关键字大小有序排列

查找过程
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,
如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,
如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

推理示例:
35

1 0	49	50
2 25 49	24
3 25 36	37
4 31 36	30
5 34 36	33
'''

# 初始化一个有序列表
nums = list(range(0, 101))

print(nums)

# 计数
count = 0

# 定义索引
idx_min = 0
idx_max = len(nums)-1

txt = input('请输入数字: ')
txt_int = int(txt)

print(idx_min, idx_max)

while idx_min <= idx_max:

    count += 1

    mid = (idx_min + idx_max) // 2

    if  txt_int > nums[mid]:
        idx_min = mid + 1
    elif txt_int < nums[mid]:
        idx_max = mid -1
    else:
        print('恭喜,猜对了', txt_int)
        break

    # 格式化输出,便于理解每次比对情况
    print('第{0}次, idx_min:{1}, mdx_max:{2},mid:{3}'.format(count, idx_min, idx_max, mid))

 结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
请输入数字: 35
0 100
第1次, idx_min:0, mdx_max:49,mid:50
第2次, idx_min:25, mdx_max:49,mid:24
第3次, idx_min:25, mdx_max:36,mid:37
第4次, idx_min:31, mdx_max:36,mid:30
第5次, idx_min:34, mdx_max:36,mid:33
恭喜,猜对了 35

Process finished with exit code 0

 

posted on 2018-12-25 17:21  xuegqcto  阅读(156)  评论(0)    收藏  举报

导航