【2017-09-04】数据结构与算法(三)
2017-09-04 本文已影响0人
小蜗牛的成长
字典的运算
-
字典的简单数学运算
问题:怎样在数据字典中执行一些计算操作 (比如求最小值、最大值、排序等等)
在数据字典中进行min() 、max() 、sorted()等数学运算,仅仅作用于键上,而不是值,如果需要使用值,可借助zip()等方法来协助计算,需要注意的是:zip()返回的是一个迭代器,具有时效性
实例:下列为股票名和价格映射字典,查找最小和最大股票价格和股票值的代码
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
prices_min=min(zip(prices.values(),prices.keys()))
prices_max=max(zip(prices.values(),prices.keys()))
prices_sorted = sorted(zip(prices.values(), prices.keys()))
prices_sorted_1 = sorted(prices.items(), key=lambda item: item[1])
prices_sorted_re = sorted(zip(prices.values(), prices.keys()),reverse=True)#从大到小
#结果
>>prices_min=(10.75, 'FB')
>>prices_max=(612.78, 'AAPL')
>>prices_sorted=[(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]
>>prices_sorted_1=[('FB', 10.75), ('HPQ', 37.2), ('ACME', 45.23), ('IBM', 205.55), ('AAPL', 612.78)]
>>prices_sorted_re=[(612.78, 'AAPL'), (205.55, 'IBM'), (45.23, 'ACME'), (37.2, 'HPQ'), (10.75, 'FB')]
其中,sorted(iterable,key,reverse)方法,iterable表示可以迭代的对象,例如可以是dict.items()、dict.keys()等,key是一个函数,用来选取参与比较的元素,reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序,reverse=false时则是顺序,默认时reverse=false。
-
字典的集合运算
问题:寻找2个字典的相同点,例如相同的键、相同的值等
集合运算:运算<对应于真子集⊂,<=对应于子集⊆,对应内置方法:issubset() ; >对应于真包含⊃,>=对应于包含⊇,对应内置方法:issuperset() ; 交集 的运算符号是& ,对应内置方法:intersection();并集的运算符号是|,对应内置方法:union() 等等
#实例:过滤字典自定的关键字:过滤掉z、w关键字
a = {
'x' : 1,
'y' : 2,
'z' : 3
}
b= {
'w' : 10,
'x' : 11,
'y' : 2
}
c={key:a[key] for key in a.keys()-{"z","w"}}
print(c)
#结果
>>{'y': 2, 'x': 1}
-
从字典中提取子集
字典推导表达式的应用
b= {
'w' : 10,
'x' : 11,
'y' : 2
}
over={key:value for key,value in b.items() if value>5}
over1=dict((key,value) for key,value in b.items() if value>5)#性能更好
print(over)
print(over1)
#结果
>>{'w': 10, 'x': 11}
>>{'w': 10, 'x': 11}
推导式,又称为解析式,可以从一个数据序列构造一个新的数据序列的结构体。python中,主要有:
- 列表推导式(list)
- 字典推倒时(dict)
- 集合推倒时(set)
#列表推倒时,使用[]:求30以内,能被3整除的数
multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
#结果
>>[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
#集合推倒时,使用{}:对列表中每个值进行指数(幂)计算
squared = {x**2 for x in [1, 1, 2]}
print(squared)
#结果
>>{1, 4}
#生成生成器,使用():求30以内,能被3整除的数
multiples = (i for i in range(30) if i % 3 is 0)
print(multiples)
#结果
>><generator object <genexpr> at 0x007F1630>