pythonの辞書型あれこれ

条件を指定して選び出す

値がNone以外の項目だけで新たな辞書を作る。

dic = {k:v for k,v in dic.items() if v != None}

応用で2つの辞書の差分(not in)、積(in)もできる。

dic = {k:v for k,v in softmachine.items() if k not in nucleus}

keyを指定して分けたい

指定keysで「選び出す」1

def dict_pick(src:dict, *keys) -> dict:
    '''
    srcから指定されたkeyだけを取り出した辞書を返す
    srcにないkeyは除外される
    srcは変化しない
    '''
    d = {}
    for k in keys & src.keys():
        d[k] = src.get(k)
    return d

>>> dict_pick(cactus, 'guitar', 'bass', 'drums')
{'guitar' : 'Jim McCarty',
 'bass'   : 'Tim Bogert',
 'drums'  : 'Carmine Appice'}

指定keysで「抜き出す」、get=>pop

def dict_pickout(src:dict, *keys) -> dict:
    '''
    srcは変化する、指定された項目がsrcから削除される
    '''
    d = {}
    for k in keys & src.keys():
        d[k] = src.pop(k)
    return d

>>> dict_pickout(jethrotull, 'vocal')
{'vocal' : 'Ian Anderson'}
>>> jethrotull.get('vocal')
None # Ian Andersonが唯一無二なのさ

参考


  1. 「取り出す」という日本語は、元から取り出して別に移す(元からは消える)のだろうか?英語だとextract?、じゃあ元は残る場合は「選び出す」?<出す>と書くと残らない気がする。よく分からないので選び出す、抜き出す、pick, pick outと書いたが間違っていると思うので、求む正解。