Python基础练习:数据结构大汇总(从列表到序列) ——阿里云天池

Python基础练习:数据结构大汇总(从列表到序列) ——阿里云天池

  • 一,学习内容概括
    • 1,学习地址
    • 2,主要学习内容
  • 二,具体学习内容
    • (1)列表[ ]
      • 列表创建
      • 向列表中添加元素*append, extend, insert*
      • 删除列表中的元素,*remove,pop,del*
      • 获取列表中的元素
      • 列表的常用操作符
      • 列表的其它方法
    • (2)元组( )
      • 创建和访问一个元组
      • 更新和删除一个元组
      • 元组相关的操作符
      • 内置方法( count 和 index )
      • 解压元组
    • (3)字符串
      • 字符串的定义
      • 字符串的切片与拼接
      • 字符串的常用内置方法
      • 字符串格式化
    • (4)字典{ }
      • 可变类型与不可变类型
      • 字典的定义
      • 创建和访问字典
      • 字典的内置方法
    • (5)集合{ }
      • 集合的创建
      • 访问集合中的值
      • 集合的内置方法(add,update,remove,discard,pop)
      • 集合的转换
      • 不可变集合
    • (6)序列
      • 针对序列的内置函数
    • 三,学习问题和解决方法
    • 四,学习总结

一,学习内容概括

1,学习地址

https://dsw-dev.data.aliyun.com/#/?fileUrl=http%3A%2F%2Ftianchi-media.oss-cn-beijing.aliyuncs.com%2FDSW%2FPython%2FPython2.ipynb&fileName=Python2.ipynb.

2,主要学习内容

  1. 列表
    列表的定义
    列表的创建
    向列表中添加元素
    删除列表中的元素
    获取列表中的元素
    列表的常用操作符
    列表的其它方法
  2. 元组
    创建和访问一个元组
    更新和删除一个元组
    元组相关的操作符
    内置方法
    解压元组
  3. 字符串
    字符串的定义
    字符串的切片与拼接
    字符串的常用内置方法
    字符串格式化
  4. 字典
    可变类型与不可变类型
    字典的定义
    创建和访问字典
    字典的内置方法
  5. 集合
    集合的创建
    访问集合中的值
    集合的内置方法
    集合的转换
    不可变集合
  6. 序列
    针对序列的内置函数

二,具体学习内容

(1)列表[ ]

列表创建

#列表里面可以是字符串,列表
x = ['Monday', 'Tuesday',2,3,[4,5,'Friday']]
print(x, type(x))
#利用推导式进行创建
#表示列表中的元素个数
x = [0] * 5
print(x, type(x))
# i为0放在x中
x = [0 for i in range(5)]
print(x, type(x))
#第一个i表示要放在x中的值
x = [i for i in range(10)]
print(x, type(x))
#步长为2
x = [i for i in range(1, 10, 2)]
print(x, type(x))
# 倒着来
x = [i for i in range(10, 1, -2)]
print(x, type(x))
# i的值为i的平方放在x中
x = [i ** 2 for i in range(1, 10)]
print(x, type(x))
# 
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x, type(x))
#先内后外
x = [[0] * 3] * 4
print(x, type(x))
#替换索引值为0的列表中索引值为0的元素
x[0][0] = 1
print(x, type(x))
# 
a = [0] * 3
x = [a] * 4
print(x, type(x))
x[0][0] = 1
print(x, type(x))
#创建空列表
empty = []
print(empty, type(empty))  
#创建混合列表,列表中包括字符串,列表,整数,浮点数
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
print(mix, type(mix))  

向列表中添加元素append, extend, insert

  • list.append(obj) 在列表末尾添加新的对象

只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.append('Thursday')
print(x,len(x))  
x.append(['Thursday', 'Sunday'])
print(x,len(x)) 
  • list.extend(seq)

列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.extend(['Thursday', 'Sunday'])
print(x)  

严格来说 append 是追加,把一个东西整体添加在列表后,而 extend 是扩展,把一个东西里的所有元素添加在列表后

  • list.insert(index, obj) 在编号 index 位置插入 obj
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.insert(2, 'Sunday')
print(x)

删除列表中的元素,remove,pop,del

  • list.remove(obj) 移除列表中某个值的第一个匹配项
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.remove('Monday')
print(x)
x.remove('Friday')
print(x)
  • list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
#pop通过索引值进行去掉一个(默认最后一个)
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
y = x.pop()
print(y)  
y = x.pop(0)
print(y) 
y = x.pop(-2)
print(y)  
print(x)  
#如果知道要删除的元素在列表中的位置,可使用del语句
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del x[0:2]
print(x) 

remove 和 pop 都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引

获取列表中的元素

#通过索引值获取元素
x = ['Monday', 'Tuesday', 'Wednesday', ['Thursday', 'Friday']]
print(x[0], type(x[0]))  
print(x[-1], type(x[-1]))  
print(x[-2], type(x[-2])) 
#通过切片的方法获取元素【开始:结束:步长】
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[3:])  
print(x[-3:]) 
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:4:2])  
print(week[:4:2])  
print(week[1::2])  
print(week[::-1])  

浅拷贝,深拷贝有啥区别

#浅拷贝:复制列表中所有元素
eek = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:])  
#深拷贝
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
#排序
print(list2)  
print(list3)  
list1.sort()
print(list2)  
print(list3)  
#之间有啥区别吗
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2)  
print(list3)  
list1[0][0] = 111
print(list2)  
print(list3)  

列表的常用操作符

等号操作符:==
连接操作符 +
重复操作符 *
成员关系操作符 in、not in

list1 = [123, 456]
list2 = [456, 123]
list3 = [123, 456]
#返回true,false
print(list1 == list2) 
#+表示extend扩展
list4 = list1 + list2  
print(list4)  
#重复
list5 = list3 * 3
print(list5)  
#上面的简单形式
list3 *= 3
print(list3)  
#在不在返回true,false
print(123 in list3)  
print(456 not in list3)  

列表的其它方法

  • list.count(obj) 统计某个元素在列表中出现的次数
list1 = [123, 456] * 3
print(list1)  
num = list1.count(123)
print(num)  
  • list.index(x[, start[, end]]) 从列表中找出某个值第一个匹配项的索引位置
list1 = [123, 456] * 5
print(list1.index(123))  
print(list1.index(123, 1)) 
print(list1.index(123, 3, 7))  
  • list.reverse() 反向列表中元素
x = [123, 456, 789]
x.reverse()
print(x)  
  • list.sort(key=None, reverse=False) 对原列表进行排序。

reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)

#升序
x = [123, 456, 789, 213]
x.sort()
print(x)
#降序
x.sort(reverse=True)
print(x)
# 获取列表的第二个元素
def takeSecond(elem):
    return elem[1]
x = [(2, 2), (3, 4), (4, 1), (1, 3)]
x.sort(key=takeSecond)
print(x)
x.sort(key=lambda a: a[0])
print(x)

(2)元组( )

创建和访问一个元组

元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串

#小括号用不用都可以
t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1))
print(t2, type(t2))
#元素的获取,使用索引值
tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
print(tuple1[1])  
print(tuple1[5:])  
print(tuple1[:5])  
#浅拷贝的方式进行构建
tuple2 = tuple1[:]
print(tuple2) 
#元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用
x = (1) #整数看待
print(type(x)) 
x = (1,)
print(type(x))  
x = 2, 3, 4, 5
print(type(x)) 
#空列表的构建
x = []
print(type(x)) 
#空元组的建立
x = ()
print(type(x))  
#重复
print(8 * (8))  
print(8 * (8,))

构建二维元组

#不加小括号
x = (1, 10.31, 'python'), ('data', 11)
print(x)
# 添加小括号
x = ((1, 10.31, 'python'), ('data', 11))
print(x)
#通过索引值进行获取元素
print(x[0])
print(x[0][0], x[0][1], x[0][2])
print(x[0][0:2])

更新和删除一个元组

元组具有不可更改的性质,但是元组中的元素有可更改,比如列表具有可更改性质

#添加元素,使用索引值
week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
print(week) 
#元组元素具有不可更改性质,替换元素,使用索引值
#元组具有不可更改的性质,但是元组中的元素有可更改,比如列表具有可更改性质
t1 = (1, 2, 3, [4, 5, 6])
print(t1)  
t1[3][0] = 9
print(t1)  # (1, 2, 3, [9, 5, 6])

'''
#错误的使用,原因是元组具有不可更改性质
t1[0]=8
print(t1)
'''

元组相关的操作符

等号操作符:==
连接操作符 +
重复操作符 *
成员关系操作符 in、not in
元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接

t1 = (123, 456)
t2 = (456, 123)
t3 = (123, 456)
#返回值为True,False
print(t1 == t2)  # False
print(t1 == t3)  # True
#元组首尾拼接
t4 = t1 + t2
print(t4) 
#元组复制拼接
t5 = t3 * 3
print(t5)  
t3 *= 3
print(t3)  
#返回值True,False
print(123 in t3)  
print(456 not in t3)  

内置方法( count 和 index )

元组大小和内容都不可更改,因此只有 count 和 index 两种方法

t = (1, 10.31, 'python')
print(t.count('python'))  
print(t.index(10.31)) 

解压元组

#解压(unpack)一维元组(有几个元素左边括号定义几个变量)
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
#解压二维元组(按照元组里的元组结构来定义变量)
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
print(t,type(t))
#如果你只想要元组其中几个元素,用通配符「*」,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c)  
print(rest)  
#如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」
t = 1, 2, 3, 4, 5
a, b, *_ = t
print(a, b)  

(3)字符串

字符串的定义

#单引号
t1 = 'i love Python!'
print(t1, type(t1))
# 双引号
t2 = "I love Python!"
print(t2, type(t2))
# 可以进行运算,进行拼接
print(5 + 8)  
print('5' + '8')  

转义字符
\ 反斜杠符号
’ 单引号
" 双引号
\n 换行
\t 横向制表符(TAB)
\r 回车

单引号,双引号的困扰

print('let\'s go')  # let's go
print("let's go")  # let's go
print('C:\\now')  # C:\now
print("C:\\Program Files\\Intel\\Wifi\\Help")

原始字符串只需要在字符串前边加一个英文字母 r 即可。

print(r'C:\Program Files\Intel\Wifi\Help')  

三引号(单引号,多引号)允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符

para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print(para_str)
#单引号
para_str = '''这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
'''
print(para_str)

字符串的切片与拼接

不可更改性质
获取元素通过索引值
添加元素通过索引值

str1 = 'I Love LsgoGroup'
print(str1[:6])  
print(str1[5])  
print(str1[:6] + " 插入的字符串 " + str1[6:])  
s = 'Python'
print(s)  
print(s[2:4]) 
print(s[-5:-2]) 
print(s[2]) 
print(s[-1]) 

字符串的常用内置方法

  • 大小写

capitalize() 将字符串的第一个字符转换为大写
lower() 转换字符串中所有大写字符为小写。
upper() 转换字符串中的小写字母为大写。
swapcase() 将字符串中大写转换为小写,小写转换为大写

str2 = 'xiaoxie'
print(str2.capitalize())
print(str2.lower())  
print(str2.upper())  
print(str2.swapcase())
  • count(str, beg= 0,end=len(string))

返回str在 string 里面出现的次数,如果beg或者end指定则返回指定范围内str出现的次数

str2 = "DAXIExiaoxie"
print(str2.count('xi'))
  • endswith,startswith检查字符开始,结束

endswith(suffix, beg=0, end=len(string)) 检查字符串是否以指定子字符串 suffix 结束,返回值 True,False。如果 beg 和 end 指定值,则在指定范围内检查。
startswith(substr, beg=0,end=len(string)) 检查字符串是否以指定子字符串 substr 开头,返回值 True,False。如果 beg 和 end 指定值,则在指定范围内检查。

str2 = "DAXIExiaoxie"
print(str2.endswith('ie'))  
print(str2.endswith('xi'))  
print(str2.startswith('Da'))  
print(str2.startswith('DA')) 
  • 检查字符是否包含在字符串中

find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -1。
rfind(str, beg=0,end=len(string)) 类似于 find() 函数,不过是从右边开始查找

#返回的是索引值
str2 = "DAXIExiaoxie"
print(str2.find('xi'))  
print(str2.find('ix'))  
print(str2.rfind('xi')) 
  • isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False
str3 = '12345'
print(str3.isnumeric())  
str3 += 'a'
print(str3.isnumeric())
  • ljust,rjust左对齐,右对齐

ljust(width[, fillchar])返回一个原字符串左对齐,并使用fillchar(默认空格)填充至长度width的新字符串
rjust(width[, fillchar])返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度width的新字符串

str4 = '1101'
print(str4.ljust(8, '0'))  
print(str4.rjust(8, '0')) 
  • lstrip,rstrip,strip删除空格

lstrip([chars]) 截掉字符串左边的空格或指定字符
rstrip([chars]) 删除字符串末尾的空格或指定字符
strip([chars]) 在字符串上执行lstrip()和rstrip()

str5 = ' I Love LsgoGroup '
print(str5.lstrip())  
print(str5.lstrip().strip('I'))  
print(str5.rstrip())  
print(str5.strip())
print(str5.strip().strip('p'))
  • partition,rpartition字符串分成三元组

partition(sub) 找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub),如果字符串中不包含sub则返回(‘原字符串’,’’,’’)。
rpartition(sub)类似于partition()方法,不过是从右边开始查找

str5 = ' I Love LsgoGroup '
print(str5.strip().partition('o')) 
print(str5.strip().partition('m'))  
print(str5.strip().rpartition('o')) 
  • replace替换

replace(old, new [, max]) 把 将字符串中的old替换成new,如果max指定,则替换不超过max次

str5 = ' I Love LsgoGroup '
print(str5.strip().replace('I', 'We')) 
  • split 切片

split(str="", num) 不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。

str5 = ' I Love LsgoGroup '
print(str5.strip().split()) 
print(str5.strip().split('o'))
u = "www.baidu.com.cn"
# 使用默认分隔符
print(u.split()) 
# 以"."为分隔符
print((u.split('.'))) 
# 分割0次
print((u.split(".", 0)))
# 分割一次
print((u.split(".", 1))) 
# 分割两次
print(u.split(".", 2)) 
# 分割两次,并取序列为1的项
print((u.split(".", 2)[1]))
# 分割两次,并把分割后的三个部分保存到三个变量
u1, u2, u3 = u.split(".", 2)
print(u1)  
print(u2) 
print(u3) 

去掉换行符字符串.split(’\n’)

c = '''say
hello
baby'''
print(c)
print(c.split('\n')) 
string = "hello boy<[www.baidu.com]>byebye"
print(string.split('[')[1].split(']')[0]) 
print(string.split('[')[1].split(']')[0].split('.'))
  • splitlines 分隔

splitlines([keepends]) 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数keepends为 False,不包含换行符,如果为 True,则保留换行符。

str6 = 'I \n Love \n LsgoGroup'
print(str6.splitlines()) 
print(str6.splitlines(True))

maketrans(intab, outtab) 创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
translate(table, deletechars="") 根据参数table给出的表,转换字符串的字符,要过滤掉的字符放到deletechars参数中。

str7 = 'this is string example....wow!!!'
intab = 'aeiou'
outtab = '12345'
trantab = str7.maketrans(intab, outtab)
print(trantab)  
print(str7.translate(trantab)) 

字符串格式化

  • format 格式化函数
#位置参数
str8 = "{0} Love {1}".format('I', 'Lsgogroup')  
print(str8) 
# 关键字参数
str8 = "{a} Love {b}".format(a='I', b='Lsgogroup')  
print(str8)
 # 位置参数要在关键字参数之前
str8 = "{0} Love {b}".format('I', b='Lsgogroup') 
print(str8)  
# 保留小数点后两位
str8 = '{0:.2f}{1}'.format(27.658, 'GB')  
print(str8)  
  • 字符串格式化

%c 格式化字符及其ASCII码
%s 格式化字符串,用str()方法处理对象
%r 格式化字符串,用rper()方法处理对象
%d 格式化整数
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g 根据值的大小决定使用%f或%e
%G 作用同%g,根据值的大小决定使用%f或%E

print('%c' % 97)  
print('%c %c %c' % (97, 98, 99)) 
print('%d + %d = %d' % (4, 5, 9)) 
print("我叫 %s 今年 %d 岁!" % ('小明', 10)) 
print('%o' % 10)  
print('%x' % 10) 
print('%X' % 10) 
print('%f' % 27.658)  
print('%e' % 27.658) 
print('%E' % 27.658) 
print('%g' % 27.658)  
text = "I am %d years old." % 22
print("I said: %s." % text) 
print("I said: %r." % text)  
  • 格式化操作符辅助指令

m.n m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)
-用作左对齐
+在正数前面显示加号( + )
#在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) 0 显示的数字前面填充’0’而不是默认的空格

print('%5.1f' % 27.658) 
print('%.2e' % 27.658) 
print('%10d' % 10)  
print('%-10d' % 10)     
print('%+d' % 10) 
print('%#o' % 10) 
print('%#x' % 108) 
print('%010d' % 5)

(4)字典{ }

可变类型与不可变类型

序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。
字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。

如何快速判断一个数据类型 X 是不是可变类型的呢?两种方法:
麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则 X 可变。
便捷方法:用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。

#使用id判断i 是不可变,整数是不可变类型
i = 1
print(id(i))  
i = i + 2
print(id(i)) 
#列表的id相同,是可变类型
l = [1, 2]
print(id(l))  
l.append('Python')
print(id(l)) 

数值、字符和元组 都能被哈希,因此它们是不可变类型。
列表、集合、字典不能被哈希,因此它是可变类型。

#数值、字符和元组 都能被哈希,因此它们是不可变类型。
print(hash('Name'))  
print(hash((1, 2, 'Python'))) 
#列表、集合、字典不能被哈希,因此它是可变类型。
print(hash([1, 2, 'Python']))
print(hash({1, 2, 3}))
# TypeError: unhashable type: 'set'

字典的定义

字典是无序的
(key:value)

创建和访问字典

字典是无序的

#字典是无序的
dic2 = {'rice': 35, 'wheat': 101, 'corn': 67}
print(dic2) 
print(dic2['rice']) 
  • 空字典
#dict() 创建一个空的字典
dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3
print(dic)
#替换
dic['a'] = 11
print(dic)
dic['d'] = 4
print(dic)

直接构建dict

#直接构建,key ,value
dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克'])  
#首先一个例子
brand = ['李宁', '耐克', '阿迪达斯']
slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing']
print('耐克的口号是:', slogan[brand.index('耐克')])  

#通过字符串或数值作为key来创建字典
dic1 = {1: 'one', 2: 'two', 3: 'three'}
print(dic1)  
print(dic1[1]) 
print(dic1[4]) 
'''
KeyError                                  Traceback (most recent call last)
 in ()
      2 print(dic1)  # {1: 'one', 2: 'two', 3: 'three'}
      3 print(dic1[1])  # one
----> 4 print(dic1[4])  # KeyError: 4

KeyError: 4
'''
  • 通过元组作为key来创建字典,但一般不这样使用
#通过元组作为key来创建字典,但一般不这样使用
dic = {(1, 2, 3): "Tom", "Age": 12, 3: [3, 5, 7]}
print(dic)  # {(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}
print(type(dic))

这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误

#这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误
dic = dict(name='Tom', age=10)
print(dic)  
print(type(dic))  

通过(【 (),(),()】)
通过(((),(),()))

#通过(【 (),(),()】)
dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1) 
#通过(((),(),()))
dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2) 

字典的内置方法

  • dict.fromkeys(seq[, value]) 用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值
#键对应的初始值默认为None
seq = ('name', 'age', 'sex')
dic1 = dict.fromkeys(seq)
print(dic1)

dic2 = dict.fromkeys(seq, 10)
print(dic2)

dic3 = dict.fromkeys(seq, ('小马', '8', '男'))
print(dic3)
  • dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键
dic = {'Name': 'lsgogroup', 'Age': 7}
print(dic.keys())  # dict_keys(['Name', 'Age'])
lst = list(dic.keys())  # 键转换为列表
print(lst)  # ['Name', 'Age']
lst = list(dic.values())  # 键的对应值转换为列表
print(lst) 
  • dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值
dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print(dic.values())
print(list(dic.values())) #无序的
  • dict.items()以列表返回可遍历的 (键, 值) 元组数组
dic = {'Name': 'Lsgogroup', 'Age': 7}
print(dic.items())
#元组
print(tuple(dic.items()))
#列表
print(list(dic.items()))
  • dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值
dic = {'Name': 'Lsgogroup', 'Age': 27}
print("Age 值为 : %s" % dic.get('Age')) 
print("Sex 值为 : %s" % dic.get('Sex', "NA")) 
print(dic) 
  • dict.setdefault(key, default=None)和get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值
dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Age 键的值为 : %s" % dic.setdefault('Age', None))  
print("Sex 键的值为 : %s" % dic.setdefault('Sex', None)) 
print(dic)  
  • key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true
dic = {'Name': 'Lsgogroup', 'Age': 7}
# in 检测键 Age 是否存在
if 'Age' in dic:
    print("键 Age 存在")
else:
    print("键 Age 不存在")
    
# 检测键 Sex 是否存在
if 'Sex' in dic:
    print("键 Sex 存在")
else:
    print("键 Sex 不存在")

# not in 检测键 Age 是否存在
if 'Age' not in dic:
    print("键 Age 不存在")
else:
    print("键 Age 存在")
  • dict.pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值。
    del dict[key] 删除字典给定键 key 所对应的值
dic1 = {1: "a", 2: [1, 2]}
print(dic1.pop(1), dic1)  # a {2: [1, 2]}

# 设置默认值,必须添加,否则报错
print(dic1.pop(3, "nokey"), dic1) 

del dic1[2]
print(dic1) 
  • dict.popitem()随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
dic1 = {1: "a", 2: [1, 2]}
print(dic1.popitem()) 
print(dic1) 
  • dict.clear()用于删除字典内所有元素
dic = {'Name': 'Zara', 'Age': 7}
print("字典长度 : %d" % len(dic))  
dic.clear()
print("字典删除后长度 : %d" % len(dic))  
# 字典删除后长度 : 0
  • dict.copy()返回一个字典的浅复制
dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
dic2 = dic1.copy()
print("dic2")  

直接赋值和 copy 的区别

dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}

# 引用对象
dic2 = dic1  
# 浅拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()  

print(id(dic1))  
print(id(dic2)) 
print(id(dic3)) 

# 修改 data 数据
dic1['user'] = 'root'
dic1['num'].remove(1)

# 输出结果
print(dic1) 
print(dic2) 
print(dic3) 
  • dict.update(dict2)把字典参数 dict2 的 key:value对 更新到字典 dict 里
dic = {'Name': 'Lsgogroup', 'Age': 7}
dic2 = {'Sex': 'female', 'Age': 8}
dic.update(dic2)
print(dic)  

(5)集合{ }

无重复,无序

set与dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。key为不可变类型,即可哈希的值。

#字典
num = {}
print(type(num)) 
#集合
num = {1, 2, 3, 4}
print(type(num)) 

集合的创建

先创建对象再加入元素
创建空集合的时候只能使用s = set(),因为s = {}创建的是空字典。

basket = set()
basket.add('apple')
basket.add('banana')
print(basket) 

直接把一堆元素用花括号括起来{元素1, 元素2, …, 元素n}。
重复元素在set中会被自动被过滤

#自动过滤重复元素
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) 
  • 使用set(value)工厂函数,把列表或元组转换成集合
a = set('abracadabra')
print(a)  
#将元组转换成集合
b = set(("Google", "Lsgogroup", "Taobao", "Taobao"))
print(b)  
# 将列表转换为集合
c = set(["Google", "Lsgogroup", "Taobao", "Google"])
print(c)  
  • 去掉列表中重复的元素
lst = [0, 1, 2, 3, 4, 5, 5, 3, 1]
#建一个空的
temp = []
for item in lst:
    if item not in temp:
        temp.append(item)
print(temp)
a = set(lst)
print(list(a)) 

由于 set 存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值,但是可以判断一个元素是否在集合中。

访问集合中的值

  • 使用len()內建函数得到集合的大小
#将列表转换为集合
s = set(['Google', 'Baidu', 'Taobao'])
print(len(s))
  • 使用for把集合中的数据一个个读取出来
s = set(['Google', 'Baidu', 'Taobao'])
for item in s:
    print(item)
  • 通过in或not in判断一个元素是否在集合中已经存在,返回值为True,False
s = set(['Google', 'Baidu', 'Taobao'])
print('Taobao' in s)  
print('Facebook' not in s) 

集合的内置方法(add,update,remove,discard,pop)

  • set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作
fruits = {"apple", "banana", "cherry"}
fruits.add("orange")
print(fruits)  
# 不重复性
fruits.add("apple")
print(fruits)  
  • set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
x = {"apple", "banana", "cherry"}
y = {"google", "baidu", "apple"}
x.update(y)
print(x)

y.update(["lsgo", "dreamtech"])
print(y)
  • set.remove(item) 用于移除集合中的指定元素。如果元素不存在,则会发生错误。
fruits = {"apple", "banana", "cherry"}
fruits.remove("banana")
print(fruits) 
  • set.discard(value) 用于移除指定的集合元素。remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会报错
fruits = {"apple", "banana", "cherry"}
fruits.discard("banana")
print(fruits)
  • set.pop() 用于随机移除一个元素
fruits = {"apple", "banana", "cherry"}
x = fruits.pop()
print(fruits) 
print(x)
  • 两个或多个 set 可以做数学意义上的集合操作

set.intersection(set1, set2) 返回两个集合的交集
set1 & set2 返回两个集合的交集
set.intersection_update(set1, set2) 交集,在原始的集合上移除不重叠的元素。

#获取集合
a = set('abracadabra')
b = set('alacazam')
print(a)  
print(b)  
#set1 & set2 返回两个集合的交集
c = a.intersection(b)
print(c) 
print(a & b) 
print(a) 

a.intersection_update(b)
print(a) 

set.union(set1, set2) 返回两个集合的并集。
set1 | set2 返回两个集合的并集。

a = set('abracadabra')
b = set('alacazam')
print(a) 
print(b) 
#并集
print(a | b)  
#并集
c = a.union(b)
print(c)  

set.difference(set) 返回集合的差集。
set1 - set2 返回集合的差集。
set.difference_update(set) 集合的差集,直接在原来的集合中移除元素,没有返回值。

a = set('abracadabra')
b = set('alacazam')
print(a)  
print(b) 
c = a.difference(b)
print(c)  
print(a - b) 
#直接在原来的集合中移除元素,没有返回值
print(a) 
a.difference_update(b)
print(a)  

set.symmetric_difference(set)返回集合的异或。
set1 ^ set2 返回集合的异或。
set.symmetric_difference_update(set)移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。

a = set('abracadabra')
b = set('alacazam')
print(a)  
print(b) 
c = a.symmetric_difference(b)
print(c)  # {'m', 'r', 'l', 'b', 'z', 'd'}
print(a ^ b)  # {'m', 'r', 'l', 'b', 'z', 'd'}

print(a)  # {'r', 'd', 'c', 'a', 'b'}
a.symmetric_difference_update(b)
print(a)  # {'r', 'b', 'm', 'l', 'z', 'd'}

set.issubset(set)判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。
set1 <= set2 判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。

x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b", "a"}
z = x.issubset(y)
print(z)  
print(x <= y) 

x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b"}
z = x.issubset(y)
print(z)  
print(x <= y) 

set.issuperset(set)用于判断集合是不是包含其他集合,如果是则返回 True,否则返回 False。
set1 >= set2 判断集合是不是包含其他集合,如果是则返回 True,否则返回 False。

x = {"f", "e", "d", "c", "b", "a"}
y = {"a", "b", "c"}
z = x.issuperset(y)
print(z)  
print(x >= y)  

x = {"f", "e", "d", "c", "b"}
y = {"a", "b", "c"}
z = x.issuperset(y)
print(z)  
print(x >= y) 

set.isdisjoint(set) 用于判断两个集合是不是不相交,如果是返回 True,否则返回 False。

x = {"f", "e", "d", "c", "b"}
y = {"a", "b", "c"}
z = x.isdisjoint(y)
print(z) 
x = {"f", "e", "d", "m", "g"}
y = {"a", "b", "c"}
z = x.isdisjoint(y)
print(z) 

集合的转换

se = set(range(4))
li = list(se)
tu = tuple(se)

print(se, type(se))  
print(li, type(li))  
print(tu, type(tu))  

不可变集合

  • frozenset([iterable]) 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
 # 生成一个新的不可变集合
a = frozenset(range(10)) 
print(a)  

b = frozenset('lsgogroup')
print(b)  

(6)序列

序列类型包括字符串、列表、元组、集合和字典,这些序列支持一些通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作

针对序列的内置函数

  • list(sub) 把一个可迭代对象转换为列表。
a = list()
print(a) 
#元素提取
b = 'I Love LsgoGroup'
b = list(b)
print(b)  

c = (1, 1, 2, 3, 5, 8)
c = list(c)
print(c) 
  • tuple(sub) 把一个可迭代对象转换为元组
#元组
a = tuple()
print(a) 

b = 'I Love LsgoGroup'
b = tuple(b)
print(b)  

c = [1, 1, 2, 3, 5, 8]
c = tuple(c)
print(c)  
  • str(obj) 把obj对象转换为字符串
a = 123
a = str(a)
print(a)
  • len(s) 返回对象(字符、列表、元组等)长度或元素个数。 s – 对象。
a = list()
print(len(a))  

b = ('I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'G', 'r', 'o', 'u', 'p')
print(len(b))  
c = 'I Love LsgoGroup'
print(len(c)) 
  • max(sub)返回序列或者参数集合中的最大值
print(max(1, 2, 3, 4, 5)) 
print(max([-8, 99, 3, 7, 83]))  
print(max('IloveLsgoGroup'))  
  • min(sub)返回序列或参数集合中的最小值
print(min(1, 2, 3, 4, 5)) 
print(min([-8, 99, 3, 7, 83])) 
print(min('IloveLsgoGroup')) 
  • sum(iterable[, start=0]) 返回序列iterable与可选参数start的总和
print(sum([1, 3, 5, 7, 9])) 
print(sum([1, 3, 5, 7, 9], 10)) 
print(sum((1, 3, 5, 7, 9))) 
print(sum((1, 3, 5, 7, 9), 20)) 

sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

#默认为升序,reverse=True为降序
x = [-8, 99, 3, 7, 83]
print(sorted(x)) 
print(sorted(x, reverse=True))  

t = ({"age": 20, "name": "a"}, {"age": 25, "name": "b"}, {"age": 10, "name": "c"})
x = sorted(t, key=lambda a: a["age"])
print(x)
  • reversed(seq) 函数返回一个反转的迭代器。

seq – 要转换的序列,可以是 tuple, string, list 或 range。

#reversed(seq) 函数返回一个反转的迭代器
s = 'lsgogroup'
x = reversed(s)
print(type(x))  
print(x) 
print(list(x))

t = ('l', 's', 'g', 'o', 'g', 'r', 'o', 'u', 'p')
print(list(reversed(t)))

r = range(5, 9)
print(list(reversed(r)))

x = [-8, 99, 3, 7, 83]
print(list(reversed(x)))
  • enumerate(sequence, [start=0])

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
a = list(enumerate(seasons))
print(a)  
#从1开始
b = list(enumerate(seasons, 1))
print(b)  

for i, element in a:
    print('{0},{1}'.format(i, element))
  • zip(iter1 [,iter2 […]])

用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]

zipped = zip(a, b)
print(zipped)  
print(list(zipped))  
zipped = zip(a, c)
print(list(zipped))  
a1, a2 = zip(*zip(a, b))
print(list(a1))  
print(list(a2))  

三,学习问题和解决方法

Q:0 for i in range(5)
A:百度搜索以及同学解释,就是把0放在x中
Q:元组元素具有不可更改性质,不能直接进行更改,但是有的可以更改,比如在元组中的元素是列表,可以使用索引值进行修改
A:掌握元组的性质,通过百度搜索

四,学习总结

掌握列表,字符串,元组,字典,集合,序列的性质,主要是有序无序,唯一性。知道哪些可修改那些不可修改,以及代码的意思,多动手,多码代码。

你可能感兴趣的:(python基础入门,数据结构大汇总,从列表到序列,python)