欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python如何建立多個值和單個鍵的映射

 更新時間:2024年09月11日 08:52:46   作者:TakingCoding4Granted  
在Python中,常見的字典只能映射單個鍵到單個值,若需映射單個鍵到多值,可以通過將值存儲于列表或集合中實現(xiàn),使用列表可以保持元素插入順序,而使用集合則可以去重,collections模塊的defaultdict類簡化了此類多值字典的創(chuàng)建過程

問題

你希望創(chuàng)建一個字典,該字典可以建立多個值和單個鍵之間的映射(即所謂的多值字典)。

解決方案

在 Python 中,基于普通的字典類 dict 創(chuàng)建的對象一般只可以存儲一個鍵和一個值的映射。

如果你希望存儲一個鍵和多個值之間的映射,你需要將多個值存儲存儲在另一個容器中,如:列表或集合。

例如,你可能會創(chuàng)建如下所示的字典:

d = {
    'a': [1, 2, 3],
    'b': [4, 5],
}

e = {
    'a': {1, 2, 3},
    'b': {4, 5},
}

究竟是使用列表還是集合來保存多個值取決于實際需求,即如果你希望保持元素的插入順序,那么使用列表比較好;如果你希望去除重復元素且不在乎元素的插入順序,則使用集合更佳。

實際上,下面將看到,通過代碼的方式創(chuàng)建上述的字典還是比較麻煩的,需要考慮某個鍵是否已經(jīng)在字典中,并據(jù)此做不同的處理。

對此,標準模塊 collections 中的類 defaultdict 可以使得通過代碼創(chuàng)建類似上述字典變得很容易,使用該類創(chuàng)建的對象中,一個顯著的特點是,對于不存在的鍵,在第一次嘗試按照鍵添加值時,該對象做好自動的做好值的初始化。

例如:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['a']
[]
>>> d
defaultdict(<class 'list'>, {'a': []})

>>> d = defaultdict(list)
>>> d['a'].append(1)
>>> d['a'].append(2)
>>> d['b'].append(4)
>>> d
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})

>>> d = defaultdict(set)
>>> d['a'].add(1)
>>> d['a'].add(2)
>>> d['b'].add(4)
>>> d
defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})

討論

如上所述,如果使用普通的字典類 dict 創(chuàng)建對象實現(xiàn)和上述 defaultdict 類創(chuàng)建對象類似的功能,那么對于某個鍵第一個值的初始化就會比較麻煩。

例如,使用 dict 的初始化可能如下:

>>> pairs
>>> [('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5)]
>>> d = {}
>>> for key, value in pairs:
...    if key not in d:
...        d[key] = []
...    d[key].append(value)
    
>>> d
{'a': [1, 2, 3], 'b': [4, 5]}

如果使用 defaultdict ,那么代碼就會很簡潔:

>>> d = defaultdict(list)
>>> for key, value in pairs:
...    d[key].append(value)
    
>d
defaultdict(<class 'list'>, {'b': [4, 5], 'a': [1, 2, 3]})

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實現(xiàn)狄克斯特拉算法

    python實現(xiàn)狄克斯特拉算法

    這篇文章主要為大家詳細介紹了python實現(xiàn)狄克斯特拉算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python中的 No Module named ***問題及解決

    Python中的 No Module named ***問題及解決

    這篇文章主要介紹了Python中的 No Module named ***問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python數(shù)據(jù)持久化存儲實現(xiàn)方法分析

    Python數(shù)據(jù)持久化存儲實現(xiàn)方法分析

    這篇文章主要介紹了Python數(shù)據(jù)持久化存儲實現(xiàn)方法,結(jié)合實例形式分析了Python基于pymongo及mysql模塊的數(shù)據(jù)持久化存儲操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • Python字符串常規(guī)操作小結(jié)

    Python字符串常規(guī)操作小結(jié)

    本文主要介紹了Python字符串常規(guī)操作小結(jié),如拼接字符串、截取字符串、格式化字符串等,下面將對Python中常用字符串操作方法進行介紹,感興趣的可以了解一下
    2022-04-04
  • python中下標和切片的使用方法解析

    python中下標和切片的使用方法解析

    這篇文章主要介紹了python中下標和切片的使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python?pandera數(shù)據(jù)驗證和清洗的庫

    Python?pandera數(shù)據(jù)驗證和清洗的庫

    為了確保數(shù)據(jù)的質(zhì)量,Python Pandera 庫應運而生。本文將深入介紹 Python Pandera,這是一個用于數(shù)據(jù)驗證和清洗的庫,并提供豐富的示例代碼,幫助大家充分利用它來提高數(shù)據(jù)質(zhì)量
    2024-01-01
  • 最基礎(chǔ)的Python的socket編程入門教程

    最基礎(chǔ)的Python的socket編程入門教程

    這篇文章主要介紹了最基礎(chǔ)的Python的socket編程入門教程,包括最基本的發(fā)送和接受信息等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于Python元祖,列表,字典,集合的比較

    關(guān)于Python元祖,列表,字典,集合的比較

    下面小編就為大家?guī)硪黄P(guān)于Python元祖,列表,字典,集合的比較。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 學python最電腦配置有要求么

    學python最電腦配置有要求么

    在本篇內(nèi)容中小編給大家整理的是關(guān)于學習python中電腦配置的相關(guān)文章,需要的朋友們可以學習下。
    2020-07-07
  • python列表與列表算法詳解

    python列表與列表算法詳解

    這篇文章主要介紹了Python的列表和列表算法,具有一定參考價值,需要的朋友可以了解下,希望能給你帶來幫助
    2021-08-08

最新評論