python学习:list,tuple,str,set,dict

课程视频链接

跟着麦叔学Python:https://b23.tv/WOJgOT

在这里插入图片描述

1. list

# 掌握5大金刚,和8字口诀:建=增删改查操=切复

# 1. 5大金刚和各自的特点
# 作业: 1. 写出5大金刚各自的特点 2.记住8字口诀 3.整理知识导图
# 2. immutable和mutable
# score = 99
# s2 = score
# print("old score: ", id(score))
# print("old s2: ", id(s2))

# score = 98
# print("new score: ", id(score))
# print("new s2: ", id(s2))

# name = 'maishu'
# name += ' is dog'
# print(name)
# #name[2] = 'x'
# print(name[2])

# t1 = (1,2,3)
# t1 = (2, 3, 4)
# #t1[0] = 5

# ===8种玩法========


# =========== 1: 创建 = [], list(), range()=======================

#建1=
names = ['zhangsan', 'lisi', 'wangwu']
empty_names = []
print(names)

#建2
names = list() #创建1个空的列表
#可以接受一个iterable可遍历的对象
names = list(range(8)) 
names = list((1,2,3,4))
names = list('maishu is bad')

# 验证是否可遍历
from collections.abc import Iterable
print(isinstance(345, Iterable))  # False
print(names)
#有序ordered vs 排序sorted:先来后到的自然顺序;一个是按照某种要求排列



# ====== 2: 增添加元素: append, insert, extend, +    ==================
names = []

# ---增1  加在末尾
names.append('maishu')
names.append('表叔')
names.append('麦二叔')
names.append(3)
names.append((3,4,5)) #也可增加元组

# ---增2  插入
names.insert(3, 886)

# ---增3  插入的下标超出了长度,就放在最后
names.insert(13, 886)  #放在末尾
names.insert(-3, 886)  #从后往前=1,=2,=3

# ---增4 
bad_guys = ['麦叔', '小麦']
#names.append(bad_guys)  #直接把元组作为元素加进去
names.extend(bad_guys)  #把里面的元素都加进去
#names += bad_guys
#print(names)


# =========== 3: 删除元素的3种方法: del(消失), pop(拿出来), remove(删除指定元素) ===================
#两种删除方法:根据下标,根据内容删除

# ---删1: del 删除指定位置
print(names)
del names[2]
print(names)

# ---删2:pop 删除指定位置并返回
names.pop()   # = 默认去掉最后一个
n = names.pop(1)  # = 可以指定下标
print(n)    # = 会返回pop的值
names.pop(13)  # = 如果下标越界,抛出IndexError
# if(len(names)>index):  # 可以先判断
print(names)

# ---删3:remove 删除指定元素
print(names)
names.remove('maishu')  # = 只会删除第一个符合条件的
print(names)
names.remove('maishu')  # = 如果没有符合条件的,就抛出ValueError
if 'maishu' in names:   #判断有没有 in
    names.remove('maishu')


# ======== 4: 改:修改元素的值============================

# ---改1
print(names)
names[1] = 'biaoshu'

# ---改2 对于超过索引长度的,抛出异常 IndexError
print(names)
names[10] = 'biaoshu'
# list里面保存的是实际对象的地址,修改的过程就是指向了新的地址


# ======== 5. 查:查询元素[], index(), len()======================

# ---查1:查元素,下标从0开始,也可以从-1开始
print(names)
print(names[0])
print(names[-1])

# ---查2: 下标越界,会出现IndexError
print(names[9])

# ---查3: index  查询下标,
print(names.index(886))
print(names.index(8866))  # 如果没有,会抛出ValueError

# ---查4:in, not in  查在不在
if(8866 not in names):
    names.append(8866)
else:
    names.index(8866)

# ---查5: len()  查长度
print(len(names))



# ========== 6. 操做:loop,  +, *, ==, sort, reverse, max, min, sum ===========

# ---操1:loop, 逐个取出元素
for n in names:
    print('hello, ', n)

for index, n in enumerate(names):   # 逐个取出下标和元素
    print('no {} is {}'.format(index + 1, n))

# ---操2:基本运算 +, *, ==
scores = [87, 65, 98, 32]
scores2 = [87, 65, 98, 33]
print(names + scores)  # extend是一样的效果
print(scores * 3)  # 把所有元素重复3遍
print(scores == scores2) # 判断两个list是否一样,True/False


# ---操3: 排序 ordered(自然排序) sorted(按照顺序) reverse(反转)
scores.reverse()  # list.reverse() 逆序,会修改原列表
print(scores)
print(reversed(scores)) # reversed(list) 逆序,不会修改原列表,会返回一个新的

scores.sort()  # sort 排序,默认从小到大
print(scores)
scores.sort(reverse=True)  # sort 可以指定reverse=True,从大到小
print(scores)
print(sorted(scores, reverse=True)) # sorted(list) 不会修改原列表,会返回一个新的

# sort可以指定key
name_scores = [('zhangsan', 87), ('maishu', 100), ('lisi', 98)]
print(sorted(name_scores, key=lambda n: n[1]))  # n 表示list里每个元素,在这里比如是('zhangsan', 87)
# 字符串的比较,是1个个字符比较过去,按照字符顺序,
# 如果前面都一样,长的那个算大 maishu maishub


# ---操4:max, min, sum
print(max(scores))
print(min(scores))
print(sum(scores))
names = ['zhangsan', 'lisi', 'maishu']
print(names)
print(max(names)) # zhangsan
print(min(names)) # lisi
print(sum(names)) # 报错

# ========== 7.切片操作 start:end:step, 其中end不包含在里面 ====================
# print(names)
# print(names[1:6:2])


# ========== 8.复:推导式 Comprehension,map, filter ====================
# print(names)
# names2 = names[:]  # 最简单复制,地址不一样
# print(id(names))
# print(id(names2))
nums = list(range(100)) # 0-99
# print(nums)

sq_nums = [n*n for n in nums]  # 推导式 Comprehension,返回列表[n*n]
print(sq_nums)
nums_3 = [n*8 for n in nums if n%3==0]
print(nums_3)

print(list(map(lambda n: n*8, nums))) # map, 传入函数

在这里插入图片描述

2. tuple

# 掌握5大金刚之tuple,和9字口诀:基建-增删改查操-切复
# 5大金刚包括: list, tuple, set, dict, str

# ======= 1. 基本概念: tuple是一个有序的,不可改的数据结构immutable ================
#l = [5,2,3] #list
t = (5,2,3) #tuple

#优点:1.快 2.安全 3.元组可以被作为dict的key
#python -m timeit '(1,2,3)' #用了9ns左右
#python -m timeit '[1,2,3]' #用了63ns左右
#用的地方:1.参数 2.其他不变的情况


# ======= 2.建 =============================
t1 = (5,8,9)
t2 = tuple([1,2,4]) #把list转换为tuple
t3 = tuple('maishu')
#t4 = tuple(5) iterable可被枚举的才可以被转换
# t5 = (5)
# print(type(t5)) # 只是一个整数
t5 = (5,)
print(type(t5))  #元组


# 增 - 不能

# 删 - 不能

# 改 - 不能
a = (1,3,5)
print(id(a))
a = (8,3,5)
print(id(a))  # 地址不一样,所以不能改,a只是引用,不是元组本身

# ======= 3.查 =============================
print(a[1])

# 操 - 不能
# a.sort()
# a.reverse()

# ======= 4.切(本身相当于新建,所以可以) =============================
b = a[0:-1]  #还是用方括号[]
print(b)

# ======= 5.复(复制意义不大) =============================
c = a[:]
c = a 
print(c)


3. string

# 掌握5大金刚之string,和9字口诀:基建-增删改查操-切复
# 5大金刚包括: list, tuple, str, set, dict

# ==== 1. 基 - 1. 是一个字符序列(sequence),2. 基于utf-8编码 3. str ==================
#编码:1. ASCII 2. ISO-9995-1 3.ANSI 4.GBK, GB-2312 4.UTF-8
name = '张三'
print(name)
for n in 'hellomaishu':
	print(n)

print(dir(str))  #查看字符串类名

#练习:给一个字符串,找出里面所有的o的字符个数



# ========= 2. 建 ====================================

#2.1 - 简单建 literal 单、双、三引号
zs = '张三'
ls = "李四"
ww = """王五
fsfds
fsdafdas"""
ww2 = '''王五
fsfds
fsdafdas'''

#2.2 转移字符,引号的互相嵌套
zs = '张\t三'   # 张   三
ls = 'lisi\'s'  # lisi's
ww = "wangwu's"  # wangwu's

#2.3 构造方法
score = 98.99 
score_str = str(score)
print(type(score_str))
print(str([1,2,3]))

#练习:用一个字符串,打印出"静夜思"这首诗



# ========= 3. 增 ====================================

#3.1 字符串是immutable 不可更改
name = 'zhangsan'
#name[-1] = 'm'  # 会报错,不能修改
name2 = 'zhangsan' + 'm' # 创建了一个新的

#3.2 字符串可以被拼接,但任何改变都创建了一个新的字符串
name2 = name[:-1] + 'm'
name3 = name + 'bb'

#3.3 同一个字符串在内存中就只有一份
name4 = name
name5 = 'zhangsan'
# print(id(name))
# print(id(name2))
# print(id(name3))
# print(id(name))
# print(id(name5)) # 1,4,5地址是相同的,可以重用


#4. 删 - 不可能的

#5. 改 - 不可能的


# ========= 6. 查 ====================================

#6.1 可以通过下标来访问一个字符
shame = '打工是不可能的!'
print(shame[-1])

#6.2 子串是否存在 - membership: in, not in 五大金刚都可以用
#identity: is, is not
print(type(shame) is str) # True 判断种类
print('可能X' not in shame) # True

#6.3 开头,结尾
print(shame.startswith('X打工')) # False 
print(shame.endswith('!'))  # True 

#6.4 下标
print(shame.index('可能'))  # 4

#作业:定义一个字符串的list,里面保存了很多名字,找出所有姓张的人


# ========= 7. 操 ====================================
# 1.格式化输出
name = 'zhangsan'
greeting = 'hello, ' + name + ', 吃了吗?'
g2 = 'hello, {name}, {name2}, 吃了吗?'
print(g2.format(name='麦叔', name2='张三'))
# print(f'hello, {name}, 喝了吗?')  # python3.8

# 2.拆分
names = '张三,李四,王五,二麻子'
for n in names.split(','):
 	print(n)

# 3.合并
h = 'hello'
names2 = ['张三', '莉莉丝', '王五']
print(" - ".join(names2))  #分隔符.join()
print(h.join(name)) #把多个h穿插拼接到name字符串里

# 4.查找:出现次数, re正则表达式(没讲)
name = '我是一个小小小小小小小鸟'
print(name.count('小'))

# 5.改变大小写
zhangsan = 'zhangsan is a BAD guy'
print(zhangsan.title())  # Zhangsan Is A BAD Guy 大写每个单词首字母
print(zhangsan.capitalize()) # Zhangsan is a BAD guy 大写整个字符串首字母
print(zhangsan.upper()) # 所有字母都大写
print(zhangsan.lower()) # 所有字母都小写
print(zhangsan.swapcase()) # 交换所有字母大小写
print(zhangsan.islower()) # 判断是否都小写,大写...

# 6.运算
name8 = ' wangba '
print(name8 + name) 
print(name8 * 8) # 字符串重复8次

# 7.去空格
name8 = ' wangba '
print(name8.strip())  # 'wangba' 去所有空格
print(name8.lstrip())  # 'wangba ' 只去左边空格
print(name8.rstrip())  # ' wangba' 只去右边空格

# 8.查漏补缺 - 替换
print(name.replace('小','大'))

#练习: 自行研究dir(str)里面的每个方法的作用

# 9.比较:
print('maishu' > 'Maishu3') # True
print('maishu' > 'maishu3') # False
#1个个字符比过去,碰到能决定大小的,就直接返回
#如果一边已经用完了,另一边还有,另一边就赢了
#小写字母大于大写字母;其他顺序查ASCII

#10个字符串练习
#公众号回复:str 

#8. 切片
#9. 复制

4. set

# 掌握5大金刚之set,和9字口诀:基建-增删改查操-切复
# 5大金刚包括: list, tuple, str, set/frozenset, dict

# === 1. 基础:不能重复,不分先后,只能加入immutable(不可变)的内容=========================
names1 = {'zs', 'lisi', 'zs'}
print(names1)  # {'lisi', 'zs'}

names2 = {'zs', 'lisi', [1,2]} # 报错list可变,TypeError: unhashable type: 'list'

class Person:
	def __init__(self, name):
		self.name = name
p = Person('wangwu')
names = {'zs', 'lisi', 'zs', p} #这种可变对象可以加
# print(names)
# p.name = 'wangwuwu'
# print(names)
#什么情况下用set,有重复的


# ==== 2. 创建: 大括号,空的代表dict,用set可以空的,也可以转换iterable的对象=============
score = set()
score = {98,89,69,96}
score = set((4,5,6)) # 转换,iterable
print(score)


# ====== 3. 增 ===============================
score.add('zs')
#print(score)


# ====== 4. 删 ====================================
score.remove('zs') #没有会报错
#print(score)
score.discard('ls') #有就移除,没有就什么也不错,但不会报错
#print(score)
score.clear() #清除所有内容
#print(score)


# ====== 5. 改 - 没有顺序 ============================


# ====== 6. 查 in, not in 成员运算符 ====================
score = {98,89,69,96}
print(98 not in score) #True
print(score.pop()) #随机弹出一个
for i in score:
	print(i)


# ====== 7. 操作:set集合 - 并,交 =========================
s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}
#合并
s3 = s1 | s2
s3 = s1.union(s2)
#交
s3 = s1 & s2 
s1.intersection(s2)
#差
s3 = s1 - s2
#不重复的集合
s3 = s1 ^ s2
#比较
print(s1 > s2)
print(s1.issuperset(s2)) #s1 > s2


# ====== 8.切片 不存在,无序 ==================


# ====== 9.复制 copy ===========================
p2 = Person('lisi')
score.add(p2)
print(score)
s4 = score.copy()
print(s4)

# ====== 10. frozenset ========================
s5 = frozenset(s4)
print(s5)
s5.add(88) # 报错,不能增加,冰冻set

5.dict

# 掌握5大金刚之dict,和9字口诀:基建-增删改查操-切复
# 5大金刚包括: list, tuple, str, set/frozenset, dict


# ===== 1.基础 - 键值对,key:value, key必须是immutable不可变的对象 ============================
s = {'zs':66, 'lis':88, 'ms':100}
s = {'zs':{'dd':88, 'xx':99}, 'lis':88, 'ms':100}


# ===== 2.创建 {}, dict(), zip() fromkeys() ====================================================
s = {'zs':66, 'lis':88, 'ms':100} #set也用大括号,直接{}是创建一个空的字典,而不是set
s = dict() #一个空的字典
s = dict([(1,99), (2,88), (3,100)]) #可被转换:包含成对的数据的iterable枚举
print(s)

names = ['za', 'lis', 'ww', 'wb']
scores = [78, 56, 78, 99]
s = dict(zip(names, scores)) #zip是拉链的意思
print(s)

names = ['za', 'lis', 'ww', 'wb']
s3 = dict.fromkeys(names)
print(s3)  # {'lis': None, 'wb': None, 'za': None, 'ww': None}
s4 = dict.fromkeys(names, 19)
print(s4)  # {'lis': 19, 'wb': 19, 'za': 19, 'ww': 19}


# ===== 3.增 ==================================================
s['ruhua'] = 89
print(s)
s['damei'] = 77
print(s)


# ===== 4.删 del pop, popitem, clear==============================
del s['damei'] #如果删除的key不存在,会抛出KeyError
print(s)
print(s.pop('ruhua')) # 有返回值
print(s)
print(s.popitem()) # 随机删除一个,有返回值
print(s)
s.clear() #全部清除
print(s)


# ===== 5.改 ==================================================
print(s)
s['damei'] = 99
print(s)


# ===== 6.查 [], get, in, not in ==============================
print('ww' in s)  #查询
print(s['ww'])  #访问
print(s.get('wwx')) #不存在报出None
print(s) 
s.setdefault('www', 'google.com') #设默认值,但实际并不存在,除非加进去
print(s['www'])


# ===== 7.操 遍历,items, keys, values, sort ====================
s = {'zs':66, 'lis':88, 'ms':100} 
for k in s:
	print(k, s[k])

print(list(s.keys())) #取所有key,组成list  ['lis', 'ms', 'zs']
print(list(s.values())) #取所有values,组成list  [88, 100, 66]
print(list(s.items())) #取所有元组,组成list   [('lis', 88), ('ms', 100), ('zs', 66)]

s2 = {k:v for k,v in sorted(s.items())} #按key从小到大排 {'lis': 88, 'ms': 100, 'zs': 66}
print(s2)
# Python小技巧#7:如何给字典Dict按照Value排序?


# ===== 8.切片 fromkeys ==================================================


# ===== 9.复制 copy, update =============================================
s4 = s.copy()
print(s4)
s5 = {'dfd':88, 'xxx':89, 'ww':120}
s = {'zs':66, 'ww':88, 'ms':100} 
s.update(s5) # 把s5的更新进s中
print(s) # {'ww': 120, 'xxx': 89, 'ms': 100, 'dfd': 88, 'zs': 66}


附:使用sorted对字典dict排序

1.sorted语法

sorted(iterable, key=None, reverse=False)  

参数说明:

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

① 按键key排序

from operator import itemgetter
dict = {3: 'B', 1: 'A', 2: 'C'}

# 按key升序   .items()取得3个(key,value)
# lambda x: x[0]取(key,value)的key   即(3,1,2)
d1 = sorted(dict.items(), key=lambda x: x[0], reverse=False)  # <class 'list'>

# 按key降序   itemgetter类似lambda
d2 = sorted(dict.items(), key=itemgetter(0), reverse=True)  # <class 'list'>

# 输出
print(d1, type(d1))  # [(1, 'A'), (2, 'C'), (3, 'B')] <class 'list'>
print(d2, type(d2))  # [(3, 'B'), (2, 'C'), (1, 'A')] <class 'list'>

② 按值value排序

from operator import itemgetter
dict = {3: 'B', 1: 'A', 2: 'C'}

# 按value升序   .items()取得3个(key,value)
# lambda x: x[1]取(key,value)的value   即('B','A','C')
d3 = sorted(dict.items(), key=lambda x: x[1], reverse=False)  # <class 'list'>

# 按value降序   itemgetter类似lambda
d4 = sorted(dict.items(), key=itemgetter(1), reverse=True)  # <class 'list'>

print(d3, type(d3))  # [(1, 'A'), (3, 'B'), (2, 'C')] <class 'list'>
print(d4, type(d4))  # [(2, 'C'), (3, 'B'), (1, 'A')] <class 'list'>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值