06 - 列表

一.列表的格式

  • 空列表

    listName = []
    
  • 初始化列表

    定义列的格式:[元素1, 元素2, 元素3, ..., 元素n]

    tmp = ['xiaoWang',180, 65.0, [1,2], [True, 4]]
    

注意:列表也是数据的基本类型之一,所以列表中的元素可以是列表等基本数据类型

二.列表的相关操作

1.查

  • 使用下标获取指定列表元素

    • 也有两套索引机制--正向和反向
    namesList = ['xiaoWang','xiaoZhang','xiaoHua']
    print(namesList[0])   #xiaoWang
    print(nameList[-1])   #xiaoHua
    
  • 使用切片获取多个列表元素

    list1 = [0,1,2,3,4]
    print(list1[:2])     #[0,1]
    print(list1[-2::-2])  #[3,1]
    
  • 关键字in 和 not in

    • 元素 in 列表:表示元素是否在列表中,返回值为布尔型
    • 删除之前可以先判断是否存在再删除(一般与if连用)
    movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']
    if 'abc' in movieName:
    	print('存在')
    else:
    	print('不存在')
    
  • index用来查找元素所在的位置,如果未找到则会报错

    a = ['a', 'b', 'c', 'a', 'b']
    a.index('a', 1, 4)     #3
    
  • count用来计算某个元素出现的次数

    a = ['a', 'b', 'c', 'a', 'b']
    a.count('b')     #2
    

    如果count返回值为0,表示此元素在列表中不存在

  • insert(index, object) :在指定位置index插入元素object

    strs = ['a','b','m','s']
    strs.insert(3,'h')
    print(strs)  # ['a', 'b', 'm', 'h', 's']
    

2.遍历列表

  • for xxx in xxx:

    good = [1,2,3]
    for i in good:
    	print(i,end=' ')
    	
    container = []
    while 2:
        name = input()
        age = input()
        good = [name,age]
        container.append(good)
    for goods in container:             #将container列表中的值依次取出赋给goods列表(变量),
        print('{}\t{}'.format(goods[0],goods[1]))
    
  • 使用while

    namesList = ['xiaoWang','xiaoZhang','xiaoHua']
    length = len(namesList)  # 获取列表长度
    i = 0
    while i<length:
        print(namesList[i])
        i+=1
    

3.增

  • append 在末尾添加元素(原地操作)

    list1 = ['A','B']
    list1.append('C')   #['A','B','C']
    
    list2 = ['E','F','G']
    list1.append(list2)   #['A', 'B', 'C', ['E', 'F', 'G']]
    

    注:一次性加入,将元素做为一个整体添加到列表,作为一项

  • extend 合并两个列表

    a = ['a','b','c']
    b = ['d','e','f']
    a.extend(b)
    print(a)  # ['a', 'b', 'c', 'd', 'e', 'f'] 将 b 添加到 a 里
    print(b) # ['d','e','f'] b的内容不变
    

    注:将列表的内容拆散了作为单个元素添加

  • insert 在指定位置插入元素

    insert(index, object) 在指定位置index前插入元素object

    strs = ['a','b','m','s']
    strs.insert(3,'h')
    print(strs)  # ['a', 'b', 'm', 'h', 's']
    

4.删

  • del:根据下标进行删除(有点特殊)

    • 带有下标

      a = [1,2,3,4]
      del a[1]
      print(a)
      
    • 如果是对列表名用del,表示删除列表名指向列表的指针,如果没有其他指针指向这个地址,空间就会被回收

      a = [1,2,3,4]
      del a
      
  • pop:不带参数删除最后一个元素;带参数删除指定索引元素

    movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']
    movieName.pop()   #删除最后一个元素
    movieName.pop(-2)  #删除倒数第二个元素
    
  • clear:表示清空列表中的元素,但是空间和指针还在

    a = [1,2,3,4]
    a.clear()
    
  • remove:根据元素的值或元素的名进行删除

    movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']
    movieName.remove('指环王')
    
    role = [['a',1],['b',2],['c',3]]
    aName = role[0]
    role.remove(aName)      #这里可以写元素名字
    print(role)
    

    注意:有同名元素,只删除从左到右第一个指定元素

4-1.如果列表中有同名元素,如何删除同名元素

易错:为什么不能直接用for循环按照元素名字删除

因为如果列表中同名的元素相邻,当food下标取到1时,将元素值赋给i,判断i='烧烤',于是将此元素删除。删除此元素后,列表的下标会发生变化,将元素全部往前移动,不能留空位,于是同名的烧烤下标从2变成了1,后面的元素下标依次-1,但是for循环的下标进入下一次循环会从2开始,所以就漏了目前下标变为2的元素。

#错误的写法!!!!!
food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤']
for i in food:
	if i == '烧烤'
		food.remove('烧烤')   #因为remove只删除列表中第一个出现指定名称的元素
  • 有同名的元素可以借助remove加while循环来删除

    food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤']
    
    n = 0
    while n < len(food):
        if food[0] == '烧烤':
            food.remove('烧烤')   #如果删除此元素,n的值不变,下一次循环还是从当前下标开始取值
        else:
            n += 1
    print(food)
    
  • 借助for和切片反向查找通过下标删除

    food = ['米饭','烧烤','烧烤','薯条','酸奶','可乐','烧烤']
    for i in food[::-1]:
    	if i == '烧烤':
    		food.remove(i)
    print(food)
    
  • 还有很多方法,都可以成立

5.改--修改列表元素

  • 我们是通过指定下标来访问列表元素,因此修改元素的时候,为指定的列表下标赋值即可。

6.列表转化为字符串

  • join:将列表中的元素以某符号为间隔拼接起来,返回字符串

    result = '#'.join(['1','2','a'])
    print(result)       #结果: 1#2#a
    

    但是注意:列表中的元素必须全是字符串类型的才可以拼接

三.列表的地址问题

  • 当一个列表名 = 另一个列表名时,是将地址赋给了前面,那么两者中任何一个列表做修改,内容会同时发生变化,因为两个列表名指向的是同一个空间
a = [1,2,3]
b = a     
b.append(4)
print(a)    
  • 当使用del删除列表时,因为a和b指针指向同一个地址空间,del a 只是删除了a的指针,但是列表空间还有b指针指,所以不会被回收
a = [1,2,3]
b = a   
del a
print(b)   #b依旧在

四.列表的复制

  • =号赋值,是将地址赋给了前面,那么两者中任何一个列表做修改,内容会同时发生变化,因为两个列表名指向的是同一个空间

    a = [1,2,3]
    b = a     
    b.append(4)
    print(a)    
    
  • copy方法

    使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制

    nums1 = [1, 5, 8, 9, 10, 12]
    nums2 = nums1.copy()  # 调用列表的copy方法,可以复制出一个新的列表
    
    nums2[0] = 100
    
    # 修改新列表里的数据,不会影响到原有列表里的数据
    print(nums2)
    print(nums1)
    
  • 切片

    列表和字符串一样,也支持切片,切片其实就是一种浅拷贝。

    words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
    words2 = words1[:]
    words2[0] = '你好'
    words2[2][0] = 'no'
    print(words1)  # ['hello', 'good', ['no', 'ok'], 'bad']
    print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']
    

五.列表的排序和逆序

都属于原地操作

  • sort:将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小

  • reverse:将list逆置。

    a = [1, 4, 2, 3]
    a.reverse()           #逆序
    a.sort()              #默认从小到大排序
    a.sort(reverse=True)  #从大到小排序
    
  • 例题:

    '''
    生成8个1-100之间的随机整数,保存到列表中
    键盘输入一个1-100之间的整数,将整数插入到排序后的列表中(降序)
    '''
    import random
    list1 = []
    for i in range(8):
        number = random.randint(1,100)
        list1.append(number)
        
    innum = int(input('input a integer between 1 to 100:'))
    list1.append(innum)
    list1.sort()
    list1.reverse()
    print(list1)
    
  • 冒泡排序:

    import random
    list1 = []
    n = random.randint(1,15)
    for i in range(n):
        number = random.randint(1,100)
        list1.append(number)
    
    print('原先的:',end='')
    print(list1)
    for i in range(len(list1) - 1):
        for j in range(len(list1) - 1 - i):
            if list1[j] > list1[j + 1]:
                list1[j], list1[j + 1] = list1[j + 1], list1[j]
    
    print('排序后的:',end='')
    print(list1)
    

六.列表推导式

  • 列表推导式:通过列表推导式:旧的列表 ----> 新的列表,即最终得到的是一个列表

  • 列表推导式的格式

    [表达式或元素 for 变量 in 可迭代的] 或者 [表达式或元素 for 变量 in 可迭代的 if 条件] 或者 [结果1 if 条件 else 结果2 for 变量 in 可迭代的] 或者 [结果 for i in 可迭代的 if 条件 for j in 可迭代的 if 条件]

    说明:表达式为对旧列表中满足条件的元素做相关操作(也可以直接取满足条件的元素不做操作),即可理解为对新列表中的元素做操作

    for 变量 in 旧列表:将旧列表中的元素依次取出来赋给变量

    if 条件:旧列表取出来的元素即变量,需要满足的条件


  • 格式1:[i for i in 可迭代的]

    • 第一个i:就是最终列表中存放的元素,可以做相关操作:比如 i+2
    • 可迭代的:可以是列表、元组、字典、字符串、range()
    '''
    将0-100所有偶数存放到列表中
    '''
    list1 = [i for i in range(0,101,2)]  #每循环一次就将第一个i(值等于for中的i)添加到新列表中
    print(list1)
    
    list2 = ['a' for i in range(5)]  #每循环一次,就将'a'元素添加到新的列表中
    print(list2)    #['a', 'a', 'a', 'a', 'a']
    
  • 格式2:[i for i in 可迭代的 if 条件]

    • 执行顺序:先执行for i in 可迭代的;再执行if 条件;再将满足条件的第二个i赋给到第一个i中存放到列表中
    #将全是字母的元素存放到新的列表中
    list1 = ['hello','23','world','high','34']
    list2 = [alp for alp in list1 if alp.isalpha()]   #先做for将迭代的结果赋给第二个alp,然后对alp做													判断,满足if语句的alp赋给第一个alp
    print(list2)
    
    #将长度小于4的人名首字母大写 -- 这里没有使用filter高阶函数中的lambda函数
    names = ['tom','lily','jack','bob','steven']
    result = [name.capitalize() for name in names if len(name) > 3]
    print(result)
    
    #不用列表推导式
    def func(names):
        newlist = []
        for name in names:
            if len(name) > 3:
                newlist.append(name) #列表推导式中的表达式中的元素就是这里的name
        return newlist
    print(func(names)) 
    
  • 格式3:[结果1 if 条件 else 结果2 for 变量 in 可迭代的]

    执行顺序:先执行for 变量 in 可迭代的,然后将变量送到if 条件,如果成立赋给结果1,如果不成立给结果2

    #如果是h开头的则将首字母大写,不是h开头的全部转为大写
    list1 = ['hello','23','world','high','34']
    list2 = [word.title() if word.startswith('h') else word.upper() for word in list1]
    print(list2)
    
  • 格式4:[结果 for i in 可迭代的 if 条件 for j in 可迭代的 if 条件]

    • 可嵌套多层for循环,左边是外层,右边是内层,... 依次推到下去
    a = [(i,j) for i in range(1,3) for j in range(1,4)]
    print(a)    #[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)]
    
  • 练习:

    #分组一个list里面的元组,比如[1,2,3,...,100]变成[[1,2,3],[4,5,6],...]
    list1 = [i for i in range(1,101)]
    print(list1)
    list2 = [list1[start:start + 3] for start in range(0,len(list1) - 1,3)]
    print(list2)
    

七.列表的操作综合应用

'''
王者荣耀角色管理

角色:姓名,性别,职业

添加角色
删除角色
修改角色
查询角色 单个查询
显示所有角色
退出系统

'''
import time
print('~~~~~~~~~~欢迎来到王者荣耀~~~~~~~~~~~')
allRoles = []
while True:
    print('\n\n~~~~~~~~~~~~~选择界面~~~~~~~~~~~~~~~')
    choice = int(input('1.添加角色\n2.删除角色\n3.修改角色\n4.查询角色\n5.显示所有角色\n6.退出系统\n'))
    if choice == 1:
        print('~~~~~~~~~~添加角色~~~~~~~~~~~')
        name = input('角色姓名:')
        gender = input('角色性别:')
        occupation = input('角色职业:')
        role = [name,gender,occupation]
        allRoles.append(person)
        print('~~~~~~~~~~{}添加成功~~~~~~~~~~~\n'.format(name))

    elif choice == 2:
        print('~~~~~~~~~~删除角色~~~~~~~~~~~')
        delName = input('请输入你要删除的角色姓名:')
        for role in allRoles:
            if delName in role:
                index = allRoles.index(role)
                allRoles.pop(index)
                print('~~~~~~~~~~删除成功~~~~~~~~~~~\n')
                break
            else:
                print('未找到此角色')

    elif choice == 3:
        print('~~~~~~~~~~修改角色~~~~~~~~~~~')
        delName = input('请输入你要修改的角色姓名:')
        for role in allRoles:
            if role[0] == delName:
                while True:
                    change = input('请输入要修改的内容:')
                    if change == '姓名':
                        cName = input('修改名称为:')
                        role[0] = cName
                        break
                    elif change == '性别':
                        cgender = input('修改性别为:')
                        role[1] = cgender
                        break
                    elif change == '职业':
                        coccupation = input('修改职业为:')
                        role[2] = coccupation
                        break
                    else:
                        print('未找到此内容,重新输入!\n')
                print('~~~~~~~~~~修改成功~~~~~~~~~~~\n')
                break
            else:
                print('未找到此角色')
        
    elif choice == 4:
        print('~~~~~~~~~~查询角色~~~~~~~~~~~')
        delName = input('请输入你要查询的角色姓名:')
        for role in allRoles:
            if role[0] == delName:
                print('姓名\t性别\t职业\t')
                print('{}\t{}\t{}'.format(role[0],role[1],role[2]))
                break
            else:
                print('未找到此角色')  

    elif choice == 5:
        print('~~~~~~~~~~显示所有角色~~~~~~~~~~~')
        print('姓名\t性别\t职业\t')
        for role in allRoles:
            print('{}\t{}\t{}'.format(role[0],role[1],role[2]))

    elif choice == 6:
        print('正在退出....')
        time.sleep(3)
        print('再见召唤师!')
        break

    else:
        print('没有找到该选项请重新输入!\n')
posted @ 2021-10-14 18:47  深藏Bluee  阅读(81)  评论(0)    收藏  举报