Python学习记录(3)
目录
1.嵌套
(1)列表中存储字典
(2)字典中存储列表
(3)字典中存储字典
2.命名元组(namedtuple)
(1)创建命名元组
(2)访问命名元组的元素
3.计数器
(1)创建计数器
(2)访问元素
(3)增加计数与减少计数
(4)删除元素
(5)TopN操作
1.嵌套
Python 的列表和字典可以存储任意类型的元素,所以我们可以将字典存储在列表中,也可以将列表存储在字典中,这种操作称为嵌套。
(1)列表中存储字典
# 创建3个菜单字典,包含菜名和价格
menu1 = {'fish':40, 'pork':30, 'potato':20,'noodles':15}
menu2 = {'chicken':30, 'corn':55, 'lamb':65,'onion':12}
menu3 = {'bacon':36, 'beaf':48, 'crab':72,'eggs':7}
# 将3个菜单字典存储到列表menu_total中
menu_total = [menu1,menu2,menu3]
# 输出列表
print(menu_total)
(2)字典中存储列表
# 初始化menu菜单,里面包含配料列表
menu = {'fish':['vinegar','soy','salt'], 'pork':['sugar','wine']}
# 输出pork这道菜的配料
print('The burding of pork is:',menu['pork'])
(3)字典中存储字典
# 创建一个字典menu_sum,里面包含两个子菜单字典menu1和menu2
menu_sum = {'menu1':{'fish':40, 'pork':30, 'potato':20,'noodles':15},'menu2':{'chicken':30, 'corn':55, 'lamb':65,'onion':12}
}
# 输出menu1和menu2中的菜名和价格
print(menu_sum['menu1'])
print(menu_sum['menu2'])
2.命名元组(namedtuple)
(1)创建命名元组
命名元组的构造函数接受两个参数typename,field_names:
typename:元组的名字;
field_names:元组各个元素的名称,也就是属性名称
比如:
collections.namedtuple("Point",["x","y"])
这样就创建了一个叫做Point的命名元组类,它拥有两个属性x,y。
第二个参数["x","y"]也可以写成"x y"或者"x,y",即用空格或者逗号隔开属性名,
我们可以将其赋值给一个变量:
Point = collections.namedtuple("Point","x,y")
p = collections.namedtuple("Point","x,y") #变量名不一定要和第一个参数相同
以上得到的变量Point或者p并不直接是一个元组对象,它只是一个类,如果要创建它的实例,则需要像创建类实例一样调用它:
p1 = Point(x = 0, y = 0)
p2 = p(x = 1, y = 1)
这样就创建了两个实例p1,p2,他们的内容分别是x = 0,y = 0,x = 1,y = 1。
(2)访问命名元组的元素
通过索引访问元素
print(p1[0])
print(p1[1])
当然,命名元组也可以通过属性访问:
print(p2.x)
print(p2.y)
修改元素
如果需要修改元组的元素,则不能简单的使用p1.x = 1,需要调用成员函数_replace(),它会返回一个包含新值的新实例,比如:
p1 = p1._replace(x = 1) #将p1的x值从0换到1
import collectionspoint = collections.namedtuple('point',('x','y'))
p1 = point(3,4)
print(p1)
#通过索引访问元素
print(p1[0]);print(p1[1])
#通过属性访问元素
print(p1.x);print(p1.y)
#修改元素
p1 = p1._replace(x=8)
print(p1)
3.计数器
计数器是一个无序容器,用于记录各种值出现的次数。它采用键值对的形式存储,要记录的值作为key,这个值出现的次数作为value,value值可正可负。
(1)创建计数器
import collections
#调用无参构造创建计数器
c1 = collections.Counter()
#通过可迭代对象创建计数器
c2 = collections.Counter(('a','b','c','a','a','b'))#列表
print(c2)
c3 = collections.Counter(['a','b','c','a','a'])#元组
print(c3)
c4 = collections.Counter('abcaa')#字符串
print(c4)
c5 = collections.Counter({'a':3,'b':2,'c':1})#字典
print(c5)
#指定键值对创建计数器
c6 = collections.Counter(a=3,b=2,c=1)
print(c6)
(2)访问元素
计数器是dict的子类,因此可以像使用dict那样访问计数器元素。不过与dict不同的是,当访问计数器中不存在的元素的时候,不会产生异常,而是返回0
(3)增加计数与减少计数
要改变计数器中某一元素的值,除了可以使用操作dict的方式:c.a = XXX外,计数器还提供了两个成员函数update和substract
update函数接受一个可迭代对象,然后将这个对象中各种值出现的次数加到计数器中
subtract函数与update函数类似,不过它是从计数器中减去可迭代对象中各种值出现的次数,比如
c6 = collections.Counter(a=3,b=2,c=1)
print(c6)
c6.update('aaaabbcc')
print(c6)
c6.subtract('abc')
print(c6)
'''输出结果
Counter({'a': 3, 'b': 2, 'c': 1})
Counter({'a': 7, 'b': 4, 'c': 3})
Counter({'a': 6, 'b': 3, 'c': 2})
'''
(4)删除元素
从上面的例子可以发现,当计数器中一个元素的值减少到0时,它并不会自动从计数器中删除,如果要删除元素,可以使用del函数:
c7 = collections.Counter('abbcc')
print(c7)
del(c7['a'])
print(c7)
'''输出结果
Counter({'b': 2, 'c': 2, 'a': 1})
Counter({'b': 2, 'c': 2})
'''
(5)TopN操作
计数器还提供了一个获取出现次数最多的n个元素的成员函数most_common,它返回包含这些元素的list
c8 = collections.Counter(a=5,b=6,c=7)
#输出出现次数最多的元素
print(c8.most_common(1))
#输出出现次数最多的两个元素
print(c8.most_common(2))
#不指定参数则输出所有元素all
print(c8.most_common())
'''输出结果
[('c', 7)]
[('c', 7), ('b', 6)]
[('c', 7), ('b', 6), ('a', 5)]
'''