元组和字典

学习目录纲要

 1 元组tuple
 2     元组是不可变的序列容器
 3 序列的运算:
 4     + * += *=
 5     < <= > >= == !=
 6     in not in
 7     索引和切片
 8 字典dict
 9 键————值:
10 键不能重复, 且只能用不可变类型作为字典的键
11 字典[键] = 值#添加和修改键-值对
12 del 字典[键]
13 {1:100, 2:200}
14 
15 字典的运算
16     键索引
17     字典[键] = value
18     var = 字典[键]
19     in, not in 对键
20 
21 字典推导式
22 {键表达式:值表达式 for 变量 in 可迭代对象 if 真值表达式 for 变量2 }
23 l = [1, 3, 4, 5, 8, 64, 564, 84, 51, 75, 61]
24 d = {k:None for k in l }
25 8 in l
26 
27 可变的容器
28 列表 字典 集合 字节数组
学习知识点

元组 tuple

容器类,元组是不可变的序列,同list一样,元组可以存放任意类型的数据的容器 

''字符串 []列表  ()元组

元组的表示方法:
用小括号(), 单个元素括起来后用逗号(,)区分单个对象还是元组
创建空元组的字面值:
t = () 空元组
创建非空元组的字面值表示:
t = 200,
t = (20,)
t = (200)#整数,提高优先级
t = (1, 2, 3)
t = 100, 200, 300

#查看类型type(t)用来返回t对应的类型
元组的错误
t = (20) #t绑定20这个对象, 不是元组
x, y, z = (100, 200, 300) #序列赋值
x, y, z = 100, 200, 300 #序列赋值
x, y, z = [100, 200, 300] #序列赋值
x, y, z = "ABC" #序列赋值


元组的构造(函数)tuple
tuple() 生成一个空元组, 等同于()
tuple(iterable)用可迭代对象生成一个元组

例:
t = tuple() #等同于t = ()
t = tuple(range(1, 10, 3))#t = (1, 4, 7)
t = tuple("ABC")
t = tuple([1, 2, 3 # t = (1, 2, 3)


容器都是可迭代的
t = tuple(range(1, 10, 3))
for x in t:
print(x)
 
元组的运算
+ += * *=
< <= >= > == !=
in not in
索引[ 切片[:]/[::]

+ 拼接元组
* 生成重复的元组

>>> t = 1, 2, 3
>>> id(t)
140516944054456
>>> t +=('abc',)
>>> t
(1, 2, 3, 'abc')
>>> t += ('A', 'B', 'C')
>>> t
(1, 2, 3, 'abc', 'A', 'B', 'C')
>>> id(t)
140516936989608
>>> t = (1, 2, 3)
>>> t *=2
>>> t


>>> (1, 2, 3) < (1, 3, 2)
True
>>> 2 in (1, 2, 3)
True
>>> 2 not in(1, 2, 3)
False


>>> t = tuple(range(1, 10))
>>> t
(1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> t[1]
2
>>> t[::2]
(1, 3, 5, 7, 9)
>>> t[1] = 2.2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


元祖的比较运算与列表完全相同
in / not in 运算符与列表完全相同
索引取值和切片取值的规则完全相同
元组不支持索引赋值和切片赋值(因为元组不可被改变)


元组的方法:
T.index(v[, begin[, end]])
返回对应元素的索引下标
T.count(x)
返回元组中对应的元素个数
详见:>>> help(tuple)


序列的种类:
 字符串 str ,列表 list , 元组 tuple,
字节串 bytes ,字节数组bytearray

序列相关的函数总结:
len(x), max(x), min(x),
sum(x), any(x), all(x)

构造函数:
str(obj) 将对象转为字符串
list(iterable)  将可迭代对象转为列表
tuple(iterable) ..............元组


示例:
t= (4,8,6,2,7)
L = [x for x in reversed(t)]
# t= [7,2,6,8,4] # 原来先后顺序的反向
for x in reversed(t):
print(x) # 打印:7 2 6 8 4
L2 =sorted(t) # L2=[2,4,6,7,8]
L3=sorted(t,reverse=True)
# [8,7,6,4,2]


>>> for x in reversed("ABCD"):
... print(x)
...
D
C
B
A

>>> L = [4, 8, 6, 2, 7]#列表
>>> L.sort()
>>> L
[2, 4, 6, 7, 8]
>>> t = [4, 8, 6, 2, 7]#元组
>>> sorted(t)
[2, 4, 6, 7, 8]
>>> sorted(t, reverse=True)
[8, 7, 6, 4, 2]
>>> sorted("wold")
['d', 'l', 'o', 'w']

容器小结:
字符串str #不能变的序列, 只能存字符
列表list   #可变的序列, 可以存任意数据
元组tuple   #不可变序列, 可以存任意数据

字典 dict


字典是一种可变的容器, 可以存储任意类型的数据
字典中的每个数据都是用‘键’(key)进行索引, 而不像序列可以用整数下标来进行索引
字典中的数据没有先后关系, 字典的储存是无序的
字典中的数据以键(key)-值(value)对形式进行映射存储
字典的键不能重复, 且只能用不可变类型作为字典的键

字典的字面值表示方式:
  字典的表示方式是以{} 括起来 ,以冒号(:)    分隔键-值对,各键-值对用逗号(,)分隔开

创建空字典的字面值 
 d={}   # 空字典

创建非空字典
d={'name':{tarena},'age':15}
d={1:'星期一',2:'星期二',3:'three'}
d={'国籍':'中国'}
d={1:[1,2,3],'abc':(1.1,2.2,3.3s)}
d={123:list('123')}
d={'a':{'b':200,'c':[1,2,3]}}
d={(1970,1,1):'computer year'}
  以下写法会出错(因为键不能重复)
d={'a':1,'b':2,'a':'一'}

创建非字典的字面值:
d= {'name': 'songzihong', 'aea':19}
d = {1:'one', 2: 'two', 3:'three'}
>>> d = {1:'one', 2: 'two', 3:'three'}
>>> d
{1: 'one', 2: 'two', 3: 'three'}
>>> len(d)
3

d = {'国籍': '中国'}
d = {1: [1, 2, 3], 'abc': (1.1, 2.2, 2.3)}
>>> d = {1: [1, 2, 3], 'abc': (1.1, 2.2, 2.3)}
>>> len(d)
2
d

d = {123: list("123")}
d = {'a': {'b': 200, 'c': [1, 2, 3]}}

>>> d = {'a': {'b': 200, 'c': [1, 2, 3]}}
>>> len(d)
1

d = {(1970, 1, 1): 'computer year'}


字典的构造函数dict
dict() 生成一个字的字典  等同于{}
dict(iterable) 用可迭代对象初始化一个字典
dict(**kwargs) 用关键字

>>> d = dict(name='宋梓鸿')
>>> d
{'name': '宋梓鸿'}

>>> d = dict(([1, 2], "AB"))
>>> d
{1: 2, 'A': 'B'}dict


>>> d = dict(("AB", "CD"))
>>> d
{'A': 'B', 'C': 'D'}

>>> d = {'name':'tarena', 'age':15}
>>> d
{'age': 15, 'name': 'tarena'}
>>> d = dict(name= 'tarena', age=15)
>>> d
{'age': 15, 'name': 'tarena'}
>>> print( d['age'])
15
>>> print(d ['name'])
tarena

字典的键(key)必须为不可变类型
bool int float complex str tuple
frozenset bytes(后面再讲)


字典的基本操作:
  字典的键索引
   用[]运算符可以获取和修改键所对应的值
 语法:
  字典[键]
示例:
  d={'name':'tarena','age':15}
print('姓名:',d['name'], '年龄:':d['age'])

添加/修改字典的元素
字典[键]=值

d={}
d['name']='tarena'

字典的值(value) 可以使任意类型(不可做键)
可变的数据类型四种:
list列表
dict字典
ser集合
bytearray字节数组
其他不可变的可做键

字典的基本操作:
字典的键索引
用[]运算符可以获取字典里的'键'对应的值,也可以用[]运算符来修改'键'对应的值
键索引的语法:
字典[键]

>>> d = {'name':'tarena', 'age':15}
>>> print('姓名是:', d['name'], '的年龄是:':d['age'])

字典的增删改


添加/修改字典的元素
字典[键]=值

d={}
d['name']='tarena'

键索引赋值说明:
 当键不存在时,创建键并绑定键对应的值
 当键存在时,修改键绑定的对象

说明
>>> d = {}
>>> d['name'] ='tarena'
>>> d
{'name': 'tarena'}
>>> d[0] = 100
>>> d
{0: 100, 'name': 'tarena'}
>>> d ['age'] = 15
>>> d
{0: 100, 'age': 15, 'name': 'tarena'}
>>> d['age'] = 16
>>> d
{0: 100, 'age': 16, 'name': 'tarena'}
>>> d['age'] +=1
>>> d
{0: 100, 'age': 17, 'name': 'tarena'}


赋值运算左边
变量 =
列表[100]=
字典[键] 

删除字典元素
del 字典[键]
例:
d = {'name':'tarena', 'age':15}
del d['name']
>>> d = {'name':'tarena', 'age':15}
>>> del d['name']
>>> d
{'age': 15}
>>> del d['age']
>>> d
{}

字典的成员资格判断in 运算符
可以用in 运算符判断一个键是否存在于字典中, 如果'键'在则返回True, 否则返回False
不判断值
not in与in


示例:
 d={1:'a',2:'b','三':'c'}
1 in d # True
'三' in d # True

>>> d = {'name':'tarena', 'age':15}
>>> 'tarena' in d
False
>>> 'name' in d
True
>>> 'age' not in d
False

1.)
写程序,将下数据形成一个字典seasons:
'键’ '值''
1 '春季有1, 2, 3月'
2 '夏季有4, 5, 6月'
3 ’秋季有7, 8, 9月‘
4 ’冬季有10, 11, 12月‘

月份季节显示


2.)
让用户输入一个整数, 代表一个季度, 打印这个季度对应的信息, 如果用户输入的信息不在字典内, 则打印信息不存在

 1 seasons = {'1':'春季有1, 2, 3月',     #1
 2            '2': '夏季有4, 5, 6月',    #2
 3            '3': '秋季有7, 8, 9月',    #3
 4            '4': '冬季有10, 11, 12月'     #4
 5            }
 6 n = input("请输入一个:")#或 n = int(input("请输入整数:"))
 7 if n in seasons:
 8     print(seasons[n])
 9 else:
10     print(信息不存在)
季节对应月份显示

字典的迭代访问:
  字典是可迭代对象,字典只能对键进行迭代访问

例:
d = {'name':'tarena', 'age':15}
for k in d:
print(k, '对应的值是:', d[k])


>>> d = {'name':'tarena', 'age':15}
>>> for x in d:
... print(x)
...
age
name

可以用于字典的内键(built-in)函数
len(x)     返回字典的键值对的个数
man(x)   返回字典的键的最大值
min(x)    返回字典的键的最小值
sum(x)   返回字典的键的和
any(x)       真值测试,如果字典中的一个键为真,则结果为真True
all(x)    真值测试,如果字典中所有键为真,则结果才为真


例:
d= {0:'零', 5:'伍', 8:'捌', 3:'叁'}
print(len(d)) # 4
print(max(d)) # 8
print(min(d)) # 0
print(sum(d)) # 16
print(any(d)) # True
print(all(d)) # False

 

字典的方法
函数 说明
D代表字典对象
D.clear() 清空字典
D.pop(key) 移除键,同时返回此键所对应的值
D.copy() 返回字典D的副本,只复制一层(浅拷贝)
D.update(D2) 将字典 D2 合并到D中,如果键相同,则此键的值取D2的值作为新值
D.get(key, default) 返回键key所对应的值,如果没有此键,则返回default
D.keys() 返回可迭代的 dict_keys 集合对象
D.values() 返回可迭代的 dict_values 值对象
D.items() 返回可迭代的 dict_items 对象

例子:

>>> d1 = {1:'one', 2:'二', 3:'三'}
>>> d1.get(4)
>>> d1.get(3)
'三'
>>> d1.get(3, '不存在此键')
'三'
>>> d1.get(100, '不存在此键')
'不存在此键'


>>> for v in d1.values():
... print(v)
...
one


>>> for t in d1.items():
... print(t)
...
(1, 'one')
(2, '二')
(3, '三')


>>> d1
{1: 'one', 2: '二', 3: '三'}
>>> for k, v in d1.items():
... print('键:', k, '值:', v)
...
键: 1 值: one
键: 2 值: 二
键: 3 值: 三

练习:
输入一段字符串, 打印出这个字符串中出现过的字符的出现次数
如:
输入:abcdabcaba
打印: a: 4次
  b:3次
d:1次
c:2次

 1 s = input("请输入:")
 2 d = {}#创建字典保存字符的个数
 3 for ch in s:
 4     #先判断这个字符以前是否出现过
 5     if ch not in d:#第一次出现
 6         d [ch] = 1#将出现次数设置为1
 7     else:#不是第一次出现
 8         d[ch] +=1
 9 for k in d:
10     print(k, ':', d[k], '')
单类字符数目计算


字典推导式

  字典推导式是用可迭代的对象依次生成字典的表达式

语法:
{键表达式 :值表达式 for 变量 in 可迭代对象 if 真值表达式}
-----比较列表表达式
说明:
if 子句部分可省略
例:
生成一个字典,键为1-9的整数,值为键的平方
d= {x : x ** 2 for x in range(1,10)}

>>> d= {x : x ** 2 for x in range(1,10)}
>>> d
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}


练习:
有字符串的列表如下:
L = ['tarena', 'xiaozhang', 'tyke']
用上述列表生成如下字典:
d = {'tarena': 6, 'xianzhang': 9, 'tyke':4}
注:
字典的值为键

 1 # 法一
 2 L = ['tarena', 'xiaozhang', 'tyke']
 3 a = {x : len(x) for x in L}
 4 print(a)
 5 
 6 # 法二
 7 L = ['tarena', 'xiaozhang', 'tyke']
 8 d = {}
 9 for s in L:
10     d[s] = len(s)
11 print(d)
12 
13 
14 # 法三   ???有误
15 str = input('请输入:')
16 dict_char_tmp = {i:str.count(i) for i in str}
17 dict_char= {}
18 for k, v in dict_char_tmp.items():
19     if dict_char.get(v):
20         dict_char[v].append(k)
21     else:
22         dict_char[v]=[k]
23 print(dict_char)
24 dict_char_k= sorted(dict_char.items(), key =1)
25 print(dict_char_k)
26 char_l=dict_char_k[0][1]
27 char_l.sort()
28 print('得到出现最多的:', char_l[0])
字符长度计算

字典 vs 列表
1.都是可变对象
2.索引方式不同,列表用整数索引,字典用键索引
3.字典的插入, 删除, 修改数据的速度可能会快于列表(重要)
4.列表的存储是有序的,字典的存储是无序的

练习:
1.已知有两个等长的列表 list1 和 list2 以list1中的元素为键, 以list2中的元素为值, 生成相应的字典

 1 list1 = [1001, 102, 1003, 1004]
 2 list2 = ['Tom', 'Jerry', 'Spike', 'Tyke']
 3 
 4 s = 0
 5 x ={}
 6 list1 = [1001, 102, 1003, 1004]
 7 list2 = ['Tom', 'Jerry', 'Spike', 'Tyke']
 8 for z in list1:
 9     x[z] = list1[s]
10 a = {x : z for x in list2}
11 print(a)
练习

2.输入任意个学生的姓名,年龄,成绩,每个学生的信息存入字典中,然后放入到列表中,每个学生
的信息需要手动输入,当输入姓名为空时结束输入
如:
  请输入姓名:xiaozhang
  请输入年龄:20
  请输入成绩:100
  请输入姓名:xiaoli
  请输入年龄:18
  请输入成绩:98
  请输入姓名:<回车>结束输入
要求内部存储格式如下:
[{'name':'xiaozhang','age':20,'score':100},
{'name':'xiaoli','age':18,'score':98}]
打印所有学生的信息如下:
+--------------------+--------------+-------------+
| name | age | score |
+--------------------+--------------+-------------+
| xiaozhang | 20 | 100 |
| xiaoli | 18 | 98 |
+--------------------+--------------+-------------+

 1 L = []  # 创建一个容器准备放入
 2 while True:
 3     name = input('请输入姓名: ')
 4     if not name:  # 如果名字为空,结束输入操作
 5         break
 6     age = int(input("请输入年龄: "))
 7     score = int(input("请输入成绩: "))
 8     d = {}  # 每次都会执行{} 来创建新的字典
 9     d['name'] = name
10     d['age'] = age
11     d['score'] = score
12     L.append(d)
13 
14 print(L)
15 
16 # 打印表格
17 print("+---------------+----------+----------+")
18 print("|     name      |   age    |   score  |")
19 print("+---------------+----------+----------+")
20 for d in L:
21     n = d['name'].center(15)
22     a = str(d['age']).center(10)
23     s = str(d['score']).center(10)
24     print("|%s|%s|%s|" % (n, a, s))
25 
26 # print("|   xiaozhang   |    20    |   100    |")
27 # print("|     xiaoli    |    18    |    98    |")
28 print("+---------------+----------+----------+")
学生信息管理系统1.0
原文地址:https://www.cnblogs.com/Alan-Song/p/9647896.html