字典理解
一個字典理解相似,除了它產生一個字典物件,而不是一個列表的列表解析。
一個基本的例子:
Python 2.x >= 2.7
{x: x * x for x in (1, 2, 3, 4)}
# Out: {1: 1, 2: 4, 3: 9, 4: 16}
這只是另一種寫作方式:
dict((x, x * x) for x in (1, 2, 3, 4))
# Out: {1: 1, 2: 4, 3: 9, 4: 16}
與列表推導一樣,我們可以在 dict 理解中使用條件語句來僅生成滿足某些標準的 dict 元素。
Python 2.x >= 2.7
{name: len(name) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6}
# Out: {'Exchange': 8, 'Overflow': 8}
或者,使用生成器表示式重寫。
dict((name, len(name)) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6)
# Out: {'Exchange': 8, 'Overflow': 8}
從字典開始並使用字典理解作為鍵值對過濾器
Python 2.x >= 2.7
initial_dict = {'x': 1, 'y': 2}
{key: value for key, value in initial_dict.items() if key == 'x'}
# Out: {'x': 1}
切換鍵和字典值(反轉字典)
如果你有一個包含簡單 hashable 值的 dict (重複值可能有意想不到的結果):
my_dict = {1: 'a', 2: 'b', 3: 'c'}
並且你想要交換鍵和值,你可以採取多種方法,具體取決於你的編碼風格:
swapped = {v: k for k, v in
my_dict.items()}
swapped = dict((v, k) for k, v in my_dict.iteritems())
swapped = dict(zip(
my_dict.values(), my_dict))
swapped = dict(zip(
my_dict.values(),
my_dict.keys()))
swapped = dict(map(reversed,
my_dict.items()))
print(swapped)
# Out: {a: 1, b: 2, c: 3}
Python 2.x >= 2.3
如果你的字典很大,請考慮匯入 itertools 並使用 izip
或 imap
。
合併字典
組合字典並使用巢狀字典理解可選地覆蓋舊值。
dict1 = {'w': 1, 'x': 1}
dict2 = {'x': 2, 'y': 2, 'z': 2}
{k: v for d in [dict1, dict2] for k, v in d.items()}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}
但是,字典解包( PEP 448 )可能是首選。
Python 3.x >= 3.5
{**dict1, **dict2}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}
注意 : 字典理解在 Python 3.0 中新增並向後移植到 2.7+,與列表推導不同,後者在 2.0 中新增。版本<2.7 可以使用生成器表示式和 dict()
內建來模擬字典理解的行為。