python语法基础 — chap1-06 内置数据结构

内置数据结构(变量类型)

  • list
  • set
  • dict
  • tuple

1 list(列表)

  • 一组有顺序的数据的组合
    • 数据拥有先后顺序
    • 数据可以不是一类数据

1.1 list创建

  • 直接创建:用中括号创建,内容直接用英文逗号隔开
  • 使用list创建(第二种方式)
  • 列表包含单个字符串的时候是一个特例
# 1. 创建空列表
L1 = []
# type是内置函数,负责打印出变量的类型
print(type(L1))
print(L1)

print("*"*20)

# 2. 创建带值的列表
L2 = [100]
print(type(L2))
print(L2)

print("*"*20)

# 3. 直接赋值创建列表
L3 = [2,3,1,4,6,4,6]
print(type(L3))
print(L3)

print("*"*20)

# 4. 使用list 
L4 = list()
print(type(L4))
print(L4)

print("*"*20)

# 5. list创建的特例演示
# 列表包含单个字符串
s = 100
L5 = [s]
print(type(L5))
print(L5)

print("*"*20)

# 6. list创建的特例演示
# 列表包含单个字符串
a = "liu da na"
L6 = [a]
print(type(L6))
print(L6)

1.2 列表访问与分片

  • 访问
    • 使用下标操作(索引)
    • 列表的位置是从0开始
  • 分片操作
    • 对列表进行任意一段的截取,左包括右不包括
    • L[:]
# 下标访问列表
L = [3,2,1,4,6,3,2]
print(L[3])
print(L[0])

print("*"*20)

# 分片操作
# 注意截取的范围,包含左边的下标值,不包含右边的下标值
print(L[1:4])

# 下标值可以为空,如果不写,左边下标值默认为0, 右边下标值为最大数加一,即表示截取到最后一个数据
print(L[:])
print(L[:4])
print(L[2:])

print("*"*20)

# 分片可以控制增长幅度,默认步长为1
print(L[1:6:1])

# 打印从下标1开始的数字,步长为2,每次隔一个
print(L[1:6:2])

# 下标可以超出范围,超出后不在考虑多余下标内容
print(L[2:10])

# 下标值,增长幅度可以为负数
# 为负数,表明顺序是从右往左
# 规定: 数组最后一个数字的下标是-1
L = [3,2,1,4,6,3,2]
# 分片之负数下标
print(L)
# 下面显示的是为空,因为默认分片总是从左向右截取
# 即正常情况,分片左边的值一定小于右边的值
print(L[-2:-4])
print(L[-4:-2])
# 如果分片一定左边值比右边大,则步长参数需要使用负数
# 此案例为一个list直接正反颠倒提供了一种思路
print(L[-2:-4:-1])
  • 分片操作是生成一个新的list

1.3 List删除

  • del: 删除命令
# del 删除
a = [1,2,3,4,5,6]
del a[2]
print(a)
# del 删除
# 如果使用del之后,id的值和删除前一样,则说明删除后,在同一位置生成了一个新的list
a = [1,2,3,4,5,6]
print(id(a))

del a[2]
print(id(a))
print(a)

# del一个变量后不能在继续使用此变量
del  a
print(a)
# 使用加号连接两个列表
a = [1,2,3,4,5,9]
b = [5,6,7,8,9,199]
d = ['a', 'b', 'c']
c = a + b + d
print(c)
# 使用乘号操作列表
# 列表直接跟一个整数相乘 
# 相当于把n个列表接在一起
a = [1,2,3,4,5]
b = a *3
print(b)
# 成员资格运算
# 判断元素是否在list中
a = [1,2,3,4,5,6]
b = 8

# 变量c为布尔值
c = b in a
print(c)

b = 4
print(b in a)
# not in 
a = [1,2,3,4,5]
b = 9
print(b not in a)

1.4 列表的遍历

  • for
  • while
# for in list
a = [1,2,3,4,5]

# 逐个打印列表a中的元素
for i in a:
    print(i)
b = ["I love coding"]

for i in b:
    print(i)
# range
# in 后面的变量要求是可以可迭代的内容
for i in range(1,10):
    print(i)

print(type(range(1,10)))
# while循环访问list
# 不推荐while遍历list

a = [1,2,3,4,5,6]
length = len(a)
# indx表示的是list的下标
indx = 0
while indx < length:
    print(a[indx])
    indx += 1
# 双层列表循环

#a 为嵌套列表,或者叫双层列表
a = [["one", 1], ["two", 2], ["three", 3] ]

for k,v in a:
    print(k, "--", v)
# 双层列表循环变异

#a 为嵌套列表,或者叫双层列表
a = [["one", 1, "eins"], ["two", 2], ["three", 3,4,5,6,8] ]

for k,v in a:
    print(k, "--", v)
# 双层列表循环变异

# 列表a为嵌套列表,或者叫双层列表
# 本例说明,k,v,w的个数应该跟解包出来的变量个数需要保持一致
a = [["one", 1, "汪"], ["two", 2,"汪汪"], ["three", 3,"汪汪汪"] ]

for k,v,w in a:
    print(k, "--", v, "--",w)

1.5 列表的内容

  • 通过简单方法创作列表
# for 创建
a = ['a', 'b', 'c']
# 用list a创建一个list b
# 下面代码的含义是,对于所有a中的元素,逐个放入新列表b中
b = [i for i in a]
print(b)
# 对a中所有元素乘以10,生成一个新list
a = [1,2,3,4,5,9,10]
# 用list a创建一个list b
# 下面代码的含义是,对于所有a中的元素,逐个放入新列表b中
b = [i*3 for i in a]
print(b)
# 过滤原来list中的内容放入新列表
# 原有列表a, 需要把所有a中的偶数生成新的列表b

a = [x for x in range(1,37)] #生成从1到34的一个列表
# 把a中所有偶数生成一个新的列表 b
b = [m for m in a if m % 2 == 0]
print(b)
# 列表生成式可以嵌套
# 由两个列表a,b
a = [i for i in range(1,4)] # 生成list a
print(a)

b = [i for i in range(100,400) if i % 100 == 0]  # 生成list b
print(b)

# 列表生成是可以嵌套,此时等于两个for循环嵌套
c = [  m+n for m in a for n in b]
print(c)

print('*'*20)

# 上面代码跟下面代码等价
for m in a:
    for n in b:
        print(m+n, end="  ")

# 嵌套的列表生成式也可以用条件表达式
c = [  m+n for m in a for n in b if m+n < 250]
print(c)

1.6 关于列表的常用函数

# len:求列表长度
a = [x for x in range(1,100)]
print(len(a))

# max:求列表中的最大值
# min: 同理
print(max(a))

b = ['man', 'film', 'python']
print(max(b))
# list:将其他格式的数据转换成list
a = [1,2,3]
print(list(a))
# 将字符串转换成列表
s = "I love coding"
print(list(s))
# 把range产生的内容转换成list
print(list(range(12, 19)))
# append()函数
# append 插入一个内容, 在末尾追加
a = [ i for i in range(1,5)]
print(a)
a.append(100)
print(a)
# insert()函数
# insert: 指定位置插入
# insert(index, data), 插入位置为index前面
a = [ i for i in range(1,5)]
print(a)
a.insert(3, 666)
print(a)
# 删除
# del 删除
# pop 弹出,从对位拿出一个元素,即把最后一个元素取出来
a = [ i for i in range(1,5)]
print(a)
last_ele = a.pop()
print(last_ele)
print(a)
# remove:在列表中删除指定的值的元素
# 如果被删除的值没在list中,则报错
# 即,删除list指定值的操作应该使用try。。。excepty语句,或者先行进行判断
# if x in list:
#    list.remove(x)
a = [ i for i in range(1,5)]
a.insert(4, 666)
print(a)
print(id(a))
a.remove(666)
print(a)
print(id(a))

# 输出两个id值一样,说明,remove操作是在原list直接操作
# clear:清空
a = [ i for i in range(1,5)]
print(a)
print(id(a))
a.clear()
print(a)
print(id(a))

# 如果不需要列表地址保持不变,则清空列表可以使用以下方式
# a = list()
# a = []
# reverse:翻转列表内容,原地翻转

a = [ 1,2,3,4,5]
print(a)
print(id(a))

a.reverse()

print(a)
print(id(a))
# extend:扩展列表,两个列表,把一个直接拼接到后一个上

a = [ 1,2,3,4,5]
b = [6,7,8,9,10]
print(a)
print(id(a))
print(b)
print(id(b))

a.extend(b)
print(a)
print(id(a))
# count:查找列表中指定值或元素的个数
a = [ 1,2,3,4,5]
print(a)
a.append(8)
a.insert(4, 8)
print(a)
a_len = a.count(8)
print(a_len)
# copy: 拷贝,此函数是浅拷贝

# 列表类型变量赋值示例
a = [1,2,3,4,5,666]
print(a)
# list类型,简单赋值操作,即“b=a”,是传地址
b = a
b[3] = 777
print(a)
print(id(a))
print(b)
print(id(b))

print("*" * 20)

# 为了解决以上问题,防止出现传地址的情形,list赋值需要采用copy函数
b = a.copy()
print(a)
print(id(a))
print(b)
print(id(b))

print("*" * 30)


b[3] = 888
print(a)
print(b)
# 深拷贝跟浅拷贝的区别
# 出现下列问题的原因是,copy‘函数是个浅拷贝函数,即只拷贝一层内容
# 深拷贝需要使用特定工具
a = [1,2,3, [10, 20, 30]]
b = a.copy()
print(id(a))
print(id(b))
print(id(a[3]))
print(id(b[3]))
a[3][2] = 666
print(a)
print(b)

2 tuple(元组)

  • 元组可以看成是一个不可更改的list

2.1 元组创建

# 创建空元组,直接使用小括号
t = ()
print(type(t))

# 创建一个只有一个值的元组,逗号不能少
t = (1,)
print(type(t))
print(t)

# 创建多个值的元组
t = (1,2,3,4,5)
print(type(t))
print(t)

# 使用其他结构创建
L = [1,2,3,4,5,"jay"]
t = tuple(L) # 要求tuple的参数可迭代
print(type(t))
print(t)

2.2 元组的特性

  • 有序
  • 元组数据值可以访问,不能修改,不能修改,不能修改
  • 元组数据可以是任意类型
  • 总之,list所有特性,除了可修改外,元组都具有
  • 也就意味着,list具有的一些操作,比如索引,分片,序列相加,相乘,成员资格操作等,一模一样
(1) 元组的索引和分片
# tuple索引操作
la = ['i', 'love', 'coding']
print(la)
ta = tuple(la)
print(ta[2])
# tuple分片操作
print(ta[:])
print(ta[:2])
print(ta[-1::-1])
# 索引操作
t = (1,2,3,4,5)
print(t[4])
# 超标错误
t = (1,2,3,4,5)
print(t[12])
t = (1,2,3,4,5,6)
t1 = t[1::2]
print(id(t))
print(id(t1))
print(t1)

# 切片可以超标
t2 = t[2:100]
print(t2)
(2) 元组的相加、相乘
# 元组相加
t1 = (1,2,3)
t2 = ('i','love',7)

# 传址操作,新创造了一个对象
print(t1)
print(id(t1))
t1 = t1 + t2
print(t1)
print(id(t1))

# 以上操作,类似于
t1 = (1,2,3)
t1 = (2,3,4)

# tuple 的不可修改,指的是【内容】的不可修改
# 修改tuple内容会导致报错
t1[1] = 100
# 元组相乘
t = (1,2,3)
t = t * 3
print(t)
(3) 元组的成员检测
# tuple成员检测
t = (1,2,3)
if 2 in t:
    print("YES")
else:
    print("NO")
(4) 元组的遍历
# 元组遍历,一般采用for
# 1. 单层元组遍历
t = (1,2,3,"coding", "i", "love")
for i in t:
    print(i, end=" ")
# 2. 双层元组的遍历
t = ((1,2,3), (2,3,4),("i", "love", "coding"))

# 对以上元组的遍历,可以如下
# 1.双层循环访问
for i in t:
    print(i)
    for j in i:
        print(j)

print('*'*20)        

# 2.单层循环访问
 
for k,m,n in t:   #访问子tuple
    print(k, '--', m, '--', n)
(5) 元组的常用函数
# 常用元组函数
tb = (212, 1282, 12, 1212, 45)
# len:长度
print(len(tb))

print('*'*20)

# max:最大值
print(max(tb))

print('*'*20)

# min:最小值
print(min(tb))

print('*'*20)

#count:对某一元素计数
tc = (1, 2, 1, 1, 33, 45, 44)
print(tc.count(1))

print('*'*20)

# index: 某一元素所在的位置
print(tc.index(1))

print('*'*20)

# tuple的特殊用法(python中独此一家)
a = 100
b = 'xiao doudou'
# 要求对a和b进行互换
print(a, b)
a, b = b, a
print(a, b)

3 set(集合)

  • 集合是高中数学中的一个概念
  • 一堆确定的、无序的、唯一的数据,集合中每一个数据成为一个元素

3.1 集合的定义

# 集合的定义
s = set()
print(type(s))
print(s)

# 1. 通过set定义
li = [1,2,3,4,6,7,44]
sb = set(li)
print(sb)

# 2. 使用大括号定义集合
# 此时,大括号内一定要有值,否则定义出的是一个dict
s = {1,2,3,4,5,6,7}
print(s)
print(type(s))
# 如果只是用大括号定义,则定义的是一个dict类型
d = {}
print(type(d))
print(d)

3.2 集合的特征

  • 集合内数据无序,即无法使用索引和分片
  • 集合内部数据元素具有唯一性,可以用来排除重复数据
  • 集合内的数据,str, int, float, tuple,冰冻集合等,即内部只能放置可哈希数据(集合自身不可以哈希)

3.3 集合序列操作

# 成员检测 in操作
# in, not in
s = {4,5,"i", "love", "coding"}
print(s)

if "love" in s:
    print("编程使我酸爽")

if  "haha" not in s:
    print("再也不会爱了")

3.4 集合遍历操作

# for 循环
s = {4,5,"i", "love", "coding"}

for i in s:
    print(i, end=" ")
# 带有元组的集合遍历
s = {(1,2,3), ("i", "love", "coding"), (4,5,6)}

for k,m,n in s:
    print(k, "--", m, "--", n)
    
print('*'*20)    

for k in s:
    print(k)

3.5 集合的内涵

# 普通集合内涵
# 以下集合在初始化后自动过滤掉重复元素
s = {23,223,545,3,1,2,3,4,3,2,3,1,2,4,3}
print(s)

# 普通集合内涵
# 通过集合创造集合
ss = {i for i in s}
print(ss) 
# 带条件的集合内涵
sss = {i for i in s if i % 2 == 0}
print(sss)
# 多循环的集合内涵
s1 = {1,2,3,4}
s2 = {"i", "love", "coding"}

s = {m*n for m in s2 for n in s1}
print(s)

print('*'*20)

s = {m*n for m in s2 for n in s1 if n ==2}
print(s)

3.6 集合函数/关于集合的函数

# len, max, min:跟其他基本函数一致
s = {43,23,56,223,4,2,1222,4,323,1}
print(len(s))
print(max(s))
print(min(s))
# set:生成一个集合
l = [1,2,3,4,3,23,1,2,3,4]
s = set(l)
print(s)
# add:向集合内添加(丢)元素
s = {1}
s.add(334)
print(s)
# clear
s = {1,2,3,4,5}
print(id(s))
s.clear()
print(id(s))
# 结果表明clear函数是原地清空数据
# copy:拷贝
# remove:移除制定的值,直接改变原有值,如果要删除的值不存在,报错
# discard:移除集合中指定的值,跟remove一样,但是要删除不存在,不报错
s = {23,3,4,5,1,2,3}
s.remove(4)
print(s)
s.discard(1)
print(s)

print("*" * 20)

s.discard(1100)
print(s)

s.remove(1100)
print(s)

# 为啥remove不存在的值会报keyerror
# pop 随机移除一个元素
#删除的内容是随机的 
#删除的内容没啥律,随机
s = {2,3,4,5,6,7,9}
d = s.pop()
print(d)
print(s)
# 集合函数
# intersection: 交集
# difference:差集
# union: 并集
# issubset: 检查一个集合是否为另一个子集
# issuperset: 检查一个集合是否为另一个超集
s1 = {1,2,3,4,5,6}
s2 = {5,6,7,8,9}

s_1 = s1.intersection(s2)
print(s_1)

print("*" * 20)

s_2 = s1.difference(s2)
print(s_2)
# 另一种表示
print(s1-s2)

print("*" * 20)

s_3 = s1.issubset(s2)
print(s_3)
# 集合的数学操作
s1 = {1,2,3,4,5,6}
s2 = {5,6,7,8,9}

s_1 = s1 - s2
print(s_1)

s_2 = s1 + s2
print(s_2)

3.7 frozen set:冰冻集合

  • 冰冻集合就是不可以进行任何修改的集合
  • frozenset是一种特殊集合
# 创建
s = frozenset()
print(type(s))
print(s)

4 dict字典

  • 字典是一种组合数据,没有顺序的组合数据,数据以键值对形式出现

4.1 字典的创建

# 字典的创建
# 创建空字典1
d = {}
print(d)

# 创建空字典2
d = dict()
print(d)

# 创建有值的字典, 每一组数据用冒号隔开, 每一对键值对用逗号隔开
d = {"one":1, "two":2, "three":3}
print(d)

# 用dict创建有内容字典1
d = dict({"one":1, "two":2, "three":3})
print(d)

# 用dict创建有内容字典2
# 利用关键字参数
d = dict(one=1, two=2, three=3)
print(d)


# 利用元组创建字典3(不推荐使用)
d = dict( [("one",1), ("two",2), ("three",3)])
print(d)

4.2 字典的特征

  • 字典是序列类型,但是是无序序列,所以没有分片和索引
  • 字典中的数据每个都有键值对组成,即k v对
    • key: 必须是可哈希的值,比如int、string、float、tuple, 但是,list、set、dict 不行
    • value: 任何值

4.3 字典常见操作

# 访问数据
d = {"one":1, "two":2, "three":3}
# 注意访问格式
# 中括号内是键值
print(d["one"])


d["one"] = "汪"
print(d)

# 删除某个操作
# 使用del操作
del d["one"]
print(d)
# 成员检测, in, not in
# 成员检测检测的是key内容
d = {"one":1, "two":2, "three":3}

if 2 in d:
    print("value")
    
if "two" in d:
    print("key")
    
if ("two",2) in d:
    print("kv")
# 遍历在python2 和 3 中区别比较大,代码不通用
# 按key来使用for循环
d = {"one":1, "two":2, "three":3}
# 使用for循环,直接按key值访问
for k in d:
    print(k,  d[k])
    
print('*'*20)
    
# 上述代码可以改写成如下(更倾向于使用)
for k in d.keys():
    print(k,  d[k])

print('*'*20)
    
# 只访问字典的值
for v in d.values():
    print(v)

print('*'*20)

# 注意以下特殊用法
for k,v in d.items():
    print(k,'--',v)

4.4 字典生成式

d = {"one":1, "two":2, "three":3}

# 常规字典生成式
dd = {k:v for k,v in d.items()}
print(dd)


# 加限制条件的字典生成式
dd = {k:v for k,v in d.items() if v % 2 == 0}
print(dd)

4.5 字典相关函数

# 通用函数: len, max, min, dict
# str(字典): 返回字典的字符串格式
d = {"one":1, "two":2, "three":3}
print(str(d))
# clear: 清空字典
# items: 返回字典的键值对组成的元组格式

d = {"one":1, "two":2, "three":3}
i = d.items()
print(type(i))
print(i)
# keys:返回字典的键组成的一个结构
d = {"one":1, "two":2, "three":3}
k = d.keys()
print(type(k))
print(k)
# values: 同理,一个可迭代的结构
d = {"one":1, "two":2, "three":3}
v = d.values()
print(type(v))
print(v)
# get: 根据制定键返回相应的值, 好处是:可以设置默认值
d = {"one":1, "two":2, "three":3}
print(d.get("one"))
print(d.get("on333"))

# get默认值是None,可以设置
print(d.get("one", 100))
print(d.get("one333", 100)) # 在dict中寻找one333,找不到返回100

#体会以下代码跟上面代码的区别
print(d['on333'])
# fromkeys: 使用指定的序列作为键,使用一个值作为字典的所有的键的值
l = ["杜宾", "博美", "中华田园犬"]
# 注意fromkeys两个参数的类型
# 注意fromkeys的调用主体
d = dict.fromkeys(l, "汪汪汪")
print(d)

目录
上一篇:chap1-05 函数
下一篇:chap2-01 模块

本次笔记来自于“免费Python全系列教程全栈工程师”的学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值