字典的一些特殊用法
阿新 • • 發佈:2018-07-26
模塊 -s order 用法 val end ict 普通 是否
一. 1個鍵對應多個值
比如:d = {‘a‘ : [1, 2, 3], ‘b‘ : [4, 5]},可以使用 collections 模塊中的 defaultdict 來構造這樣的字典
from collections import defaultdict
#對應的多個值是列表形式
d = defaultdict(list)
d[‘a‘].append(1)
d[‘a‘].append(2)
d[‘b‘].append(4)
#對應的多個值是集合形式
d = defaultdict(set)
d[‘a‘].add(1)
d[‘a‘].add(2)
d[‘b‘].add(4)
註意:
1. 選擇使用列表還是集合取決於你的實際需求。如果你想保持元素的插入順序就應該使用列表,如果想去掉重復元素就使用集合(並且不關心元素的順序問題)
2. defaultdict的用法和普通字典的用法是一樣的,比如多值為集合形式時 d[‘a‘]的輸出為{1,2}
二. 字典元素排序,使用OrderedDict
from collections import OrderedDict
d = OrderedDict()
d[‘foo‘] = 1
d[‘bar‘] = 2
d[‘spam‘] = 3
d[‘grok‘] = 4
for key in d:
print(key, d[key])
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
註意:一個 OrderedDict 的大小是一個普通字典的兩倍,因為它內部維護著另外一個鏈表。所以如果你要構建一個需要大量 OrderedDict 實例的數據結構的時候 (比如讀取 100,000 行 CSV 數據到一個 OrderedDict 列表中去),那麽你就得仔細權衡一下是否使用 OrderedDict 帶來的好處要大過額外內存消耗的影響
三. 字典中執行計算操作,使用zip()反轉鍵和值
1. 正常情況下,在字典上的運算只會作用於鍵,對值是無效的,如下
>>> prices = { ‘ AAA‘ : 40, ‘ZZZ‘: 28, ‘BBB‘: 34 }
>>> min(prices)
‘AAA‘
>>> max(prices)
‘ZZZ‘
2. 如果想按數值進行排序或者計算,並且結果顯示整個鍵值對。可以用zip()函數,把鍵值對反轉
>>> fanzhuan = zip(prices.values(), prices.keys())
>>> min_price = min(fanzhuan)
>>> print(min_price)
(28, ‘ZZZ‘)
註意:zip() 函數創建的是一個只能訪問一次的叠代器,每次使用都需要重新調用此函數。
3. 使用zip()函數時,如果多個實體擁有相同的值的時候,鍵會決定返回結果
>>> prices = { ‘AAA‘ : 45.23, ‘ZZZ‘: 45.23 }
>>> min(zip(prices.values(), prices.keys()))
(45.23, ‘AAA‘)
>>> max(zip(prices.values(), prices.keys()))
(45.23, ‘ZZZ‘)
四. 查找兩個字典中的相同點,比如相同的鍵名或者值
例如:a = {‘x‘ : 1, ‘y‘ : 2, ‘z‘ : 3} b = {‘w‘ : 10, ‘x‘ : 11, ‘y‘ : 2},現在查找這兩個字典中的相同處,可以在兩字典的 keys() 或者 items() 方法返回結果上執行集合操作
# 兩個字典公有的鍵
>>> a.keys() & b.keys()
{‘y‘, ‘x‘}
#只在a字典中存在的鍵
>>> a.keys() - b.keys()
{‘z‘}
#兩個字典中共有的鍵值對
>>> a.items() & b.items()
{(‘y‘, 2)}
這些操作也可以用於修改或者過濾字典元素,比如下面使用列表推導式
>>> c = {key:a[key] for key in a.keys() - {‘z‘}}
>>> c
{‘y‘: 2, ‘x‘: 1}
字典的一些特殊用法