通过名称来访问列表或元组中元素
collections.namedtuple()
这个函数实际上是一个返回 Python 中标准元组类型子类的一个工厂方法。需要传递一个类型名和字段给它,然后它就会返回一个类,你可以初始化这个类,为你定义的字段传递值等。代码示例
from collections import namedtuple
#使用namedtuple定义一个类型名和字段
numblist = namedtuple('numblist', ['nb1', 'nb2'])
#为定义好的字段赋值
sub = numblist('bill', 'dicky')
print(sub) #numblist(nb1='bill', nb2='dicky')
print(sub.nb1) #bill
print(sub.nb2) #dicky
namedtuple跟一个普通元组,其实没什么两样,可以正常索引和解压
print(sub[0]) #bill
nb1,nb2 = sub
print(nb1,nb2) #bill dicky
转换并同时计算数据(更优雅方式)
当在数据序列上执行聚集函数 (比如 sum() , min() , max() ),首先你需要先转换或者过滤数据。一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数。
计算一个列表中每个元素的平方和
mlist = [1,2,3,4,5,6]
#正常做法
ylist = []
for i in mlist:
k=i*i
ylist.append(k)
print(sum(ylist)) #91
#更优雅的做法
print(sum(i*i for i in mlist)) #91
在一个文件夹中找出py文件
import os
files = os.listdir('dirname')
#普通做法
for filename in files:
if filename.endswith('.py'):
print('这是一个python文件')
else:
print('这是其他文件')
#更优雅的做法
if any(filename.endswith('.py') for filename in files):
print('这是一个python文件')
else:
print('这是其他文件')
列表字典中找出最小值
tlist = [
{'name':'GOOG', 'money': 50},
{'name':'YHOO', 'money': 75},
{'name':'AOL', 'money': 20},
{'name':'SCOX', 'money': 65}
]
#一般的做法
hlist = []
for i in tlist:
k = i['money']
hlist.append(k)
print(min(hlist))
#更优雅的做法
print(min(s['money'] for s in tlist))
合并多个字典或映射
假如要在一个或多个字典中找查某个键的值可以用 collections.ChainMap(),也可以使用 update() 将字典合并
使用 ChinaMap()
a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }
d = {'t': 5, 's': 6 }
#使用 ChinaMap()
from collections import ChainMap
c = ChainMap(a,b,d)
print(c['x']) # 1 (from a)
print(c['y']) # 2 (from b)
print(c['z']) # 3 (from a)
print(c['s']) # 6 (from d)
一个 ChainMap 接受多个字典并将它们在逻辑上变为一个字典。然后,这些字典并不是真的合并在一起了, ChainMap 类只是在内部创建了一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的
print(len(c)) #5
print(dict(c)) #{'x': 1, 'z': 3, 't': 5, 's': 6, 'y': 2}
print(list(c.keys())) #['x', 'z', 't', 's', 'y']
print(list(c.values())) #[1, 3, 5, 6, 2]
使用 update()
例:
a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }
d = {'t': 5, 's': 6 }
#使用 update(),合并
a.update(b)
a.update(d)
print(a) #{'x': 1, 'z': 4, 'y': 2, 't': 5, 's': 6}
print(a['x']) # 1
print(a['y']) # 2
print(a['z']) # 4
update() 也能行得通,但是它需要你创建一个完全不同的字典对象 (或者是破坏现有字典结构)。如果此时再对原字典更改键的值,那么也不会反应到新的合并字典中去。”’