1. 程式人生 > >字典的一些特殊用法

字典的一些特殊用法

模塊 -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}

字典的一些特殊用法