从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

10、Python数据类型-列表类型

发布:蔺要红04-05分类: Python

列表类型

列表是一个数据的集合,集合内可以放任何数据类型,可以对集合进行方便的增删改查等操作


定义列表、查询、切片、步长
>>> name = [] #空列表
>>> name
[]
>>> names = ['lin','yao','hong','wo','ai','ni']
>>> names
['lin', 'yao', 'hong', 'wo', 'ai', 'ni']
['lin', 'yao', 'hong', 'wo', 'ai', 'ni']
>>> names[1]   #从0开始所以是yao
'yao'   
>>> names[0]
'lin'
>>> names[-1]  #取最后一个
'ni'

#位置排序  0 1 2 3 4 5
>>> n = ['lin','yao','hong',1,3,4,4,5,6,7,7,8,8,9,9,0,0,2,3,4,4]
>>> n
['lin', 'yao', 'hong', 1, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 0, 0, 2, 3, 4, 4]
>>> n.index(6) #取数字6的索引为8
8
>>> n[8] #通过索引8取出数字6
6
 为了区分数字重新举例 
>>> n = ['lin','yao','a','b','c','c','e','f','f','g','g','h','h','b','b','c','c']
>>> n
['lin', 'yao', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.index('c') #查找c的索引为4,默认找第一个为c的值
4
>>> n[4] #通过索引4取出值c
'c'
>>> n[n.index('c')] #简化直接通过索引取出c
'c'
>>> n.count('c') #查询多少个c
4
>>> n.count('f') #查询多少个f
2
>>> n[0:2]  #切片(顾头不顾尾)、0:2取出了 前两个,而没有取出2
['lin', 'yao']
>>> n[2:4]   #2:4  就是第3个和第4个
['a', 'b']
>>> n[:3]  #取出0到3
['lin', 'yao', 'a']
---------------
>>> n[0]
'lin'
>>> n[1]
'yao'
---------------
>>> 
>>> n[-5:]  #切片取最后5个
['h', 'b', 'b', 'c', 'c']
>>> n[-5:-1] #典型的顾头不顾尾
['h', 'b', 'b', 'c']
----------------
#步长:就是间隔几个取值
>>> n[0:7:1] 
['lin', 'yao', 'a', 'b', 'c', 'c', 'e']
>>> n[0:7:2] #步长2取值
['lin', 'a', 'c', 'e']
>>> n[0:7:3]#步长3取值
['lin', 'b', 'e']
>>> n[::2] #步长2、从头取到尾
['lin', 'a', 'c', 'e', 'f', 'g', 'h', 'b', 'c']

插入和修改
>>> n
['lin', 'yao', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.append(peiqi)  #错误写法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'peiqi' is not defined
>>> n.append('peiqi') #追加 append
>>> n
['lin', 'yao', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
>>> n.insert(0,'love')  #插入、在第一个插入
>>> n
['love', 'lin', 'yao', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
>>> n.insert(3,'hong') #插入、在第三个位置插入
>>> n
['love', 'lin', 'yao', 'hong', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
>>> n[3] = 'heihei'  #修改 修改第三个值hong为heihei
>>> n
['love', 'lin', 'yao', 'heihei', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
-------------
>>> n[3:5] = 'JACK LIN' #批量修改、了解一下
>>> n
['love', 'lin', 'yao', 'J', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']


插入列表
>>> names
['old', 'rain', 'ss', 'peiqi', 'girl', 'lin']
>>> n = [3,4,5]
>>> names.append(n)
>>> names
['old', 'rain', 'ss', 'peiqi', 'girl', 'lin', [3, 4, 5]]

删除
>>> n
['love', 'lin', 'yao', 'J', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
>>> n.pop(0) #删除第一个
'love'
>>> n
['lin', 'yao', 'J', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c', 'peiqi']
>>> n.pop() #删除最后一个
'peiqi'
>>> n
['lin', 'yao', 'J', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.remove('J') #删除J 这个元素
>>> n
['lin', 'yao', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.remove('c') #删除从左边开始一个c
>>> n
['lin', 'yao', 'A', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
--------------------
>>> del n[2] #删除第二个也就是A
>>> n
['lin', 'yao', 'C', 'K', ' ', 'L', 'I', 'N', 'b', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> del n[2:7]  #删除第2个和第7个批量删除
>>> n
['lin', 'yao', 'N', 'b', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
----------------------------------------
>>> names
['lin', 'yao', 'hong']
>>> del names #全局删除、这里把names这个列表(变量)也删除掉了
>>> names
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'names' is not defined
  
循环
>>> for i in range(10):  #range(10)生成一个0到10的列表
...   print(i)           #注意前面要有2个空格 去打印列表
... 
0
1
2
3
4
5
6
7
8
9
[root@test01 ~]# python2
Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(10)  #python2里可以看出是一个列表,python3里做了优化不再显示
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
排序:列表是通过索引排序的
>>> n
['lin', 'yao', 'a', 'b', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.sort()  #排序
>>> n
['a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'lin', 'yao']
-------------------------------------------------------
>>> m = ['lin','yao','hong',12,4,5,'a']
>>> m
['lin', 'yao', 'hong', 12, 4, 5, 'a']
>>> m.sort() #排序出错,str和int不能排序
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
-------------------------------------------------------
>>> n
['lin', 'yao', 'a', 'b', 'c', 'c', 'C', 'A', 'f', 'g', 'g', 'h', 'h', 'b', 'b', 'c', 'c']
>>> n.sort() #排序
>>> n        #排序顺序如下、依据ASCII码来排序
['A', 'C', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'f', 'g', 'g', 'h', 'h', 'lin', 'yao']
>>> n.insert(3,'#')
>>> n.insert(3,'!')
>>> n.insert(3,'*')
>>> n.sort()     #排序顺序如下、依据ASCII码来排序
>>> n
['!', '#', '*', 'A', 'C', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'f', 'g', 'g', 'h', 'h', 'lin', 'yao']
>>> n.reverse()   #反向排序
>>> n
['yao', 'lin', 'h', 'h', 'g', 'g', 'f', 'c', 'c', 'c', 'c', 'b', 'b', 'b', 'a', 'C', 'A', '*', '#', '!']


 
合并列表
>>> m
['hong', 'lin', 'yao', 12, 4, 5, 'a']
>>> q
['love', 'you']
>>> m + q   #合并
['hong', 'lin', 'yao', 12, 4, 5, 'a', 'love', 'you']
>>> m
['hong', 'lin', 'yao', 12, 4, 5, 'a']
>>> q
['love', 'you']
>>> m.extend(q)  #或者这样合并
>>> m     #合并以后m永久等于合并
['hong', 'lin', 'yao', 12, 4, 5, 'a', 'love', 'you']
>>> q  #q不变
['love', 'you']
 
clear清除
>>> q
['love', 'you']
>>> q.clear()
>>> q
[]
 
copy和变量详细学习
--------------------------变量-----------------------------------
>>> a = 15
>>> b = a
>>> b
15
>>> id(a)
9169984
>>> id(b)
9169984
>>> a = 20  # 当a=20时、发生的变化:会指向另外一个唯一标识符、而不是修改15
>>> b    #b的值不变
15
>>> a
20
>>> id(a)    #在python解释器里的唯一标识符发生了变化
9170144
>>> id(b)    #唯一标识符并未发生变化
9169984
----------------------【浅】copy复制、是独立复制一个-----------------------
>>> n2 = ['hong', 'love', 'you']  #创建一个n2列表
>>> names = n2.copy()            #复制一个names列表
>>> n2
['hong', 'love', 'you']
>>> names
['hong', 'love', 'you']
>>> id(n2)                 #唯一标识符不一样
140244680269960
>>> id(names)
140244680273544            #唯一标识符不一样
>>> names[2] = 'AAA'       #修改names,names发生变化、而n2不会发生变化
>>> names
['hong', 'love', 'AAA']
>>> n2
['hong', 'love', 'you']
>>> id(n2)
140244680269960
>>> id(names)
140244680273544
-*-------------------------------copy另外举例----------------
>>> n2 = ['hong', 'love', 'you']
>>> names = n2.copy()
>>> id(n2),id(names)
140146199302280,140146199440328
>>> id(n2[2]),id(names[2])
140146199292536,140146199292536
>>> names.append(['long',24])
>>> names
['hong', 'love', 'you', ['long', 24]]
>>> n2
['hong', 'love', 'you']
------------先放着小分支----------
>>> m = names.copy()
>>> m
['hong', 'love', 'you', ['long', 24]]
>>> id(names), id(m)     #copy了一个、内存地址都是独立的不一样
(140146199440328, 140146198729096)
>>> id(names[0]), id(m[0])  #列表的内存地址不一样、但是列表里的元素地址都一样
(140146199292368, 140146199292368)
>>> m
['hong', 'love', 'you', ['long', 24]]
>>> names
['hong', 'love', 'you', ['long', 24]]
>>> names [0] = "HONG"      #namse修改hong为HONG names变了、而m没变
>>> names
['HONG', 'love', 'you', ['long', 24]]
>>> m
['hong', 'love', 'you', ['long', 24]]
>>> id(names[0]), id(m[0])   #names修改了hong以后,hong的内存地址也发生了变化
(140146198728352, 140146199292368)
>>> names[-1][0] = "LONG"   #names修改列表里的小列表long、namse和m一起发生了变化
>>> names
['HONG', 'love', 'you', ['LONG', 24]]
>>> m
['hong', 'love', 'you', ['LONG', 24]]

#What???为啥修改了列表里面的元素、names改了、而m没改变??原理和上面的变量一样
#What???为啥修改了列表里面小列表的元素,names和m同时变了???
>>> id(names[-1]), id(m[-1])  #一样
(140146199440264, 140146199440264)
#因为copy只是复制了【子列表】的内存地址、共享子列表里的元素
>>> names
['HONG', 'love', 'you', ['LONG', 24]]
>>> m
['hong', 'love', 'you', ['LONG', 24]]
>>> names[-1][0]
'LONG'
>>> names[-1][0] = "AAA"
>>> names
['HONG', 'love', 'you', ['AAA', 24]]
>>> m
['hong', 'love', 'you', ['AAA', 24]]

#这种copy也叫做浅copy、只能独立第一层的元素
#就算在copy之前就已经存在子列表、也是只能独立第一层元素
举例
>>> A = ['HONG', 'love', 'you', ['BBB', 24]]
>>> B = A.copy()
>>> A,B
(['HONG', 'love', 'you', ['BBB', 24]], ['HONG', 'love', 'you', ['BBB', 24]])
>>> A[-1][0]
'BBB'
>>> A[-1][0] = "AAAA"
>>> A
['HONG', 'love', 'you', ['AAAA', 24]]
>>> B
['HONG', 'love', 'you', ['AAAA', 24]]
--------------------------------#所以就产生了深copy--------------------------------------
>>> names
['HONG', 'love', 'you', ['BBB', 24]]  #已经存在子列表
>>> import copy  #导入模块
>>> m2 = copy.deepcopy(names)  #复制
>>> names
['HONG', 'love', 'you', ['BBB', 24]]
>>> m2
['HONG', 'love', 'you', ['BBB', 24]]
>>> names[-1][0] = "TTTTTTTTTT"   #修改names里子列表的BBB
>>> names
['HONG', 'love', 'you', ['TTTTTTTTTT', 24]]
>>> m2
['HONG', 'love', 'you', ['BBB', 24]]     #m2没有跟着变化、和上文中的例子明显对立

----------------------n = n8 是指向同一个唯一标识符-----------------------

>>> n = [2,3,4]
>>> m = n
>>> id(n),id(m)
139694200385224,139694200385224  #列表的唯一标识符一致
>>> id(n[1]),id(m[1])            #列表元素的唯一标识符一样
9169600,9169600
>>> n[1] = 'L'                   #修改了n --- m也会跟着变化
>>> n
[2, 'L', 4]
>>> m
[2, 'L', 4]
>>> id(n),id(m)        #修改了列表元素、列表唯一标识符不变、但是列表元素的唯一标识符发生变化
139694200385224,139694200385224
>>> id(n[1],id(m[1])  #列表元素的唯一标识符发生变化
139694200881480,139694200881480



练习题:打印出索引和索引对应的元素
n = ['lin', 'yao', 'N','g', 'c']
count = 0
for i in n:
    print(count,i)
    count +=1
E:\Python\学习\venv\Scripts\python.exe E:/Python/学习/python21天入门/第二章/二进制.py
0 lin
1 yao
2 N
3 g
4 c
n = ['lin', 'yao', 'N','g', 'c']
for index,i in enumerate(n):#枚举
    print(index,i)
#打印索引和元素值
E:\Python\学习\venv\Scripts\python.exe E:/Python/学习/python21天入门/第二章/二进制.py
0 lin
1 yao
2 N
3 g
4 c
 
知识点:判断是否为数字
'33'.isdigit()
True
'lin'.isdigit()
False
 
知识点:获取列表长度
products = [['phone1',100],['phone2',200],['phone3',300],['phone4',500],['phone5',500],['phone6',600]]
len(products)
6

打印出商品列表并修改奇数为-1、
n = ['lin', 'yao', 'N','g', 'c']
for index,i in enumerate(n):#枚举
    if index%2  == 0:
        n[index] = -1
        print(index,i)
print(n)
D:\python\python.exe F:/运维笔记/python/第二章/商品列表.py
0 lin
2 N
4 c
[-1, 'yao', -1, 'g', -1]


打印出商品列表、选择商品后加入购物车、如果输入q则退出,并且打印出购物车的东西
products = [['phone1',100],['phone2',200],['phone3',300],['phone4',500],['phone5',500],['phone6',600]]
shopping_cart = []
run_flag = True #标志位
while run_flag:
    print("---------商品列表----------")
    for index, p in enumerate(products):
        print("%s.  %s  %s" % (index, p[0], p[1]))
    # choice = int(input("输入想购买的商品编号:"))   #input输入的都为字符串、所以要加上int
    choice = input("输入想购买的商品编号:") 
    if choice.isdigit(): #isdigit用法、为数字返回True、否则返回False
        choice = int(choice)
        if choice >= 0 and choice < len(products):
            shopping_cart.append(products[choice])
            print("Added product %s into shopping cart. " %(products[choice]))
        else:
            print("商品不存在")
    elif choice == 'q':
        if len(shopping_cart) >0:
            print("---------您购买的产品为-----------")
            for index, p in enumerate(shopping_cart):
                print("%s.  %s  %s" % (index, p[0], p[1]))
        # break
        run_flag  = False
    else:
        print("请输入数字")


-------------------------

E:\python\venv\Scripts\python.exe E:/python/python21天入门/循环购物车.py
---------商品列表----------
0.  phone1  100
1.  phone2  200
2.  phone3  300
3.  phone4  500
4.  phone5  500
5.  phone6  600
输入想购买的商品编号:1
Added product ['phone2', 200] into shopping cart. 
---------商品列表----------
0.  phone1  100
1.  phone2  200
2.  phone3  300
3.  phone4  500
4.  phone5  500
5.  phone6  600
输入想购买的商品编号:2
Added product ['phone3', 300] into shopping cart. 
---------商品列表----------
0.  phone1  100
1.  phone2  200
2.  phone3  300
3.  phone4  500
4.  phone5  500
5.  phone6  600
输入想购买的商品编号:q
---------您购买的产品为-----------
0.  phone2  200
1.  phone3  300
用户输入工资,打印出商品列表、选择商品后加入购物车、如果输入q则退出,打印出购物车的东西和余额、
 
products = [['phone1',100],['phone2',200],['phone3',300],['phone4',500],['phone5',500],['phone6',1800]]
shopping_cart = []
run_flag = True  # 标志位
while run_flag:
    wage = input("请输入您的工资,退出请输入q|Q:")
    if wage.isdigit():
        wage = int(wage)
        while run_flag:
            print("--------商品列表-------")
            for index,p in enumerate(products):
                print("%s: %s %s" %(index,p[0],p[1]))
            choice = input("请输入您购买的商品:")
            if choice.isdigit():
                choice = int(choice)
                if choice >= 0 and choice < len(products):
                    if wage > products[choice][1]:
                        shopping_cart.append(products[choice])
                        print("Added product %s into shopping cart. " % (products[choice]))
                        wage -= products[choice][1]
                        print(wage)
                    else:
                        print("您的余额不足")
                else:
                    print("商品不存在")
            elif choice == 'q':
                if len(shopping_cart) > 0:
                    print("---------您购买的产品为-----------")
                    for index, p in enumerate(shopping_cart):
                        print("%s.  %s  %s" % (index, p[0], p[1]))

                print('您的余额为:',wage)
                #break
                run_flag = False
            else:
                print("请输入数字")

    elif wage == 'q' or wage == 'Q':
        run_flag = False
    else:
        print('工资必须是数字')
 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站