【python3学习记录】之列表

基本操作

列表类似数组,元素种类没有限制(列表包含列表,就类似二维数组,还可三维及多维,元素可以不只是数字),可再次修改列表内容,直接使用下标操作。

list = []        # 新建列表, 另一种写法 list = list()
list = [1, 2 ,3]
l[0]    # 输出1
l[2]    # 输出3
l[-1]   # 输出3

# 可直接加入元素
list += [1]
list     # 输出[1, 2, 3, 1]

# 注意,list += 1 会报错 因为list为序列 += 后面也必须是序列
# 想要在列表中加入列表元素可以使用append

# 删除某个元素
del list[0]
list     # 输出[2, 3, 1]

骚操作

python的特色,各种骚操作,可以对列表使用+*操作,还有神奇的列表推导式等等。

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 列表的加法,就是合并一起了,加号右边列表加到加号左边列表末尾
list1 + list2    # 输出 [1, 2, 3, 4, 5, 6]

# 列表的乘法,列表乘以一个数字,直接看例子
list1 * 2    # 输出 [1, 2, 3, 1, 2, 3]  返回新列表

# 推导式
t = [x for x in range(0, 3)]    # 输出 [0, 1, 2]

# 删除
list = [1, 2, 3, 4, 5]
del(list[0:3])        # 输出[4, 5],不会删除后面出现重复片段,至于切片的内容有关
del([1, 2, 3])        # 报错 

del(list[:])        
print(list)           # 输出 []

del(list)            
print(list)           # 报错 这个是列表操作直接删除列表

# 赋值,克隆
# 赋值
a = [1, 2, 3]
b = a                # a赋值给b,用的一个地址
b.append(4)          # a 和 b 都输出[1, 2, 3, 4]  
# 嵌套赋值
a = [1, 2 ,3]
b = [4, 5]
c = [a, b]           # 输出 [[1, 2, 3], [4, 5]] 
                     # 不过 c 同时引用了a 和 b 的地址,ab改变都会影响c
a.append(3)          # c输出 [[1, 2, 3, 3], [4, 5]] 

# 克隆
# 一般使用切片,很方便,或者使用copy方法
a = [1, 2, 3]
b = a.copy() 或者 b = a[:]

截取(切片)

列表可以像字符串一样进行截取,返回的是新的列表。

list = [1, 2, 3, 4 ,5]
# 截取格式list[x1:x2:x3], x1起始位置,x2结束位置, x3跨度(x1为包,x2为开)

list[1:2]       # 输出[2] 返回新数组
list[2:1]       # 输出[] 不会报错
list[:3]        # x1可以不写但是需要有“ : ”,表示从0开始 输出 [1, 2, 3]
list[0:]        # x2可以不写但是需要有“ : ”,表示到末尾结束 输出 [1, 2, 3, 4, 5]
list[0::2]      # 输出 [1, 3] 
list[0:4:2]     # 输出 [1, 3]
list[0:5:2]     # 输出 [1, 3, 5]
list[-1:-3]     # 输出 []
list[-3:-1]     # 输出 [3, 4]
list[0::-1]     # 倒叙 输出[5, 4, 3, 2, 1]
list[0:3:-1]    # 输出 []
list[3:0:-1]    # 输出 [4, 3, 2]  可以理解为坐标也倒叙了,但是仍是左包右开
list[-2:-5:-1]  # 输出 [4, 3, 2]
list[-1:-3:-1]  # 输出 [5, 4]

列表函数&方法

python列表自带函数:获取列表长度 len(list), 获取列表中的最大值max(lsit),获取列表中的最小值mix(list), 将元组转化为列表list(seq)

list = [1, 2, 3, [1, 2, 3]]
len(list)        # 输出 4
len(list[3])     # 输出3

# max(min一样)分为几种情况,首先说明列表内容元素类型一致才可以使用max,否则报错
1. 全部为数字(包含浮点复合等其他数字类型),不做说明
2. 元素为字符串类型,则从元素首字符开始比较(比较ascii),直到找出结果
   如果存在包含关系,越长越大o_o!
list = ['abc', 'abd']    # max(list) 输出 'abd' 
list = ['abc', 'abcd']   # max(list) 输出 'abcd' 
3.  元素为序列类型,序列的元素类型也必须一致,否则报错
    比较方法与字符串大致相同,从每个序列中的第一个元素开始比较,直到找出结果或者越长越大。
list = [[1,2,3], [2,4,5]]     # max(list) 输出 [2,4,5]

#元组转列表暂时没遇到特别的情况,不多做介绍

python列表自带方法:append(obj),count(obj),extent(seq), index(obj), insert(index, obj), pop(), remove(obj), reverse(), sort(key=None, reverse=False), copy(), clear() 

#append 在结尾添加元素,可以添加各种类型
a = [1, 2, 3]
a.append(1)     # a输出 [1, 2, 3, 1]
a.append([4,5]) # a输出 [1, 2, 3, 1, [4, 5]]

# count 统计某元素在列表中出现的次数,可以统计各种类型
a.count(1)    # 输出 2

# extend 用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
# 一个例子看懂append与extend
a1 = [1,2,3]
a2 = a1.copy()
b = [4,5]
a1.append(b)     # a1 输出 [1, 2, 3, [4, 5]]
a2.extend(b)     # a2 输出 [1, 2, 3, 4, 5]

#index 从列表中找出某个值第一个匹配项的索引位置
a = [1, 2, 3, 1]
a.index(1)        # 输出0
#当元素不存在的时候会报错
a.index(5)        # 输出 ValueError: [5] is not in list,可以配合try,catch

#insert 插入,插到指定元素的前面
a.insert(0, 0)    # a 输出为 [0, 1, 2, 3, 1]
a.insert(1, 'o_o')# a 输出为 [0, 'o_o', 1, 2, 3, 1]

#pop 删除末尾元素,列表为空使用pop报错
list = []
list.pop()        # 输出 IndexError: pop from empty list

#remove 移除列表中的第一个匹配的元素
a = [1, 2, 3, 1]
a.reomve(1)         # a 输出为 [2, 3]
# 元素不存在时报错   # 输出 ValueError: list.remove(x): x not in list

#reverse 反转列表,无返回值,直接更改列表
a.reverse()        # a 输出为 [1, 3, 2, 1]

#sort(key=None, reverse=False)
  # 1.对元素都是非序列元素进行排序,使用reverse参数(reverse = True降序/False升序(默认))
  a = [3, 1, 2]
  a1 = a.copy()
  a2 = a.copy()
  a1.reverse(reverse=True)    # a1 输出为 [3, 2, 1]
  a2.reverse(reverse=False)   # a2 输出为 [1, 2, 3], 可以直接写成 a2.reverse()
  # 元素类型必须一致,否则报错
  a = ['a', 'c', 'b']
  a.sort()                       # 输出为 ['a', 'b' , 'c']  排序方式为ascii
  a = ['a', 'b', 'c', 'bffff']   # 输出为 ['a', 'b', 'bffff', 'c'] 字符串逐个比较 越长越大
  a = ['test', 1, 2]             # 报错
   

  # 2.元素都是序列可以通过key参数排序,直接看例子
  def second(e):
    return e[1]
  a = [('test',i) for i in range(0, 5)]
  print(a)
  a.sort(key=second, reverse=True)
  print(a)
  
  # 输出为
    [('test', 0), ('test', 1), ('test', 2), ('test', 3), ('test', 4)] 
    [('test', 4), ('test', 3), ('test', 2), ('test', 1), ('test', 0)]
  # 排序的元素必须存在,否则报错,如下
  a = [('test', 0), ('test', 1), ('test', 2), ('test', 3), ('test', 4), 'test'] 
  
  # 看到lambda后发现贼好用的一种写法,使用lambda代替second的方法
  a.sort(key=lambda e: e[1], reverse=True)
  

随笔

1. [[x]] * n 与 [[x] for i in range(n)] 创建多维序列的比较。

# 关于序列多级创建的问题
>>> l = [[1]] * 3
>>> l
[[1], [1], [1]]
>>> l[0].append(2)
>>> l
[[1, 2], [1, 2], [1, 2]]

>>> [[1] for i in range(3)]
[[1], [1], [1]]
>>> l = [[1] for i in range(3)]
>>> l[0].append(2)
>>> l
[[1, 2], [1], [1]]
>>>

#可以看到[[1]] * n 的写法是创建了n个[1]的引用这点需要注意,想要创建多维序列使用for循环创建为妙。

2. 关于range中步进的理解。我理解是,对于range(x1, x2, x3)你把 x1 加上 x3,如果是朝着 x2 的方向就走就是你要的序列了。看例子好理解点。

# 正常想要 1 ~ 10 步进为2的序列。一下子就能想出。
>>> [x for x in range(1, 10, 2)]
[1, 3, 5, 7, 9]

# 又想要 -1 ~ -10 步进为3的片段,你就想 -1 加上 -3 离 -10 更近一步。所以写法如下。
>>> [x for x in range(-1, -10, -3)]
[-1, -4, -7]

# -10 ~ -1 步进为2的片段,则想 -10 加上 2 离-1 更近。
>>> [x for x in range(-10, -1, 2)]
[-10, -8, -6, -4, -2]

猜你喜欢

转载自blog.csdn.net/qq_40702130/article/details/109739901