python cookbook 1數據結構和算法(2)

6.設置dict默認形式python

>>> from collections import defaultdict
>>> d=defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> d['a'].append(1)
>>> d['a'].append(2)
>>> d['b'].append(4)
>>> d
defaultdict(<type 'list'>, {'a': [1, 2], 'b': [4]})
>>>d = defaultdict(set)
也能夠採用setdefault,可是不夠優雅
>>>d = {}
>>>d.setdefault('a', []).append(1)

7字典的排序app

 OrderedDict會保留原始的插入順序python2.7

>>>from collections import OrderedDict
>>> d=OrderedDict()
>>> d['foo'] = 1
>>> d['bar'] = 2
>>> d['spam'] = 3
>>> d['grok'] = 4
>>> d
OrderedDict([('foo', 1), ('bar', 2), ('spam', 3), ('grok', 4)])

OrderedDict會在內部維持一個雙鏈表,一個新元素插入時會放在隊尾,OrderedDict佔用的內存是普通dict的兩倍,使用時須要謹慎考慮spa

8 dict的計算code

>>> prices = {'ACME': 45.23,'AAPL': 612.78,'IBM': 205.55,'HPQ': 37.20,'FB': 10.75}
>>> min_price = min(zip(prices.values(), prices.keys()))
>>> min_price
(10.75, 'FB')
或者
>>> min(prices, key=lambda k: prices[k])
'FB'
>>> prices[min(prices, key=lambda k: prices[k])]
10.75

9查找兩個dict的公共元素(僅python3支持)a.keys()也能夠像set那樣直接使用|&-^求合集,交集,差補,差分.排序

>>> a
{'y': 2, 'z': 3, 'x': 1}
>>> b
{'y': 2, 'w': 10, 'x': 11}
>>> type(a.keys())
<class 'dict_keys'>#在python2.7是list類型
>>> a.keys()&b.keys()
{'y', 'x'}
>>> a.keys()-b.keys()
{'z'}
>>> a.items()&b.items()
{('y', 2)}

10從序列中消除重複元素ip

def dedupe(items, key=None):
    seen = set()
    for item in items:
        val = item if key is None else key(item)
        if val not in seen:
            yield item
            seen.add(val)
>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
相關文章
相關標籤/搜索