• [PY3]——创建多值映射字典?/defaultdict默认字典/setdefault()


    Defaultdict 默认字典

    • collections 模块中的 defaultdict(默认字典),可以用来构造“一个键映射多个值”这样的字典
    • 如果你想保持元素的插入顺序就应该使用list, 如果想去掉重复元素就使用set
    import collections import defaultdict
    
    d
    =defaultdict(list) / e=defaultdict(set)

    d = {
        'a' : [1, 2, 3],
        'b' : [4, 5]
    }
    e = {
        'a' : {1, 2, 3},
        'b' : {4, 5}
    }
    • 要注意,defaultdict会自动为将要访问的键(就算目前字典中并不存在这样的键)创建映射实体
    from collections import defaultdict
    
    d
    =defaultdict(list) d[1].append('a') d[1].append('b') d[2].append('a') print(d[0]) [] //即使我们没有为d[0]赋值,但依旧为这个位置占了个坑 print(d) defaultdict(<class 'list'>, {0: [], 1: ['a', 'b'], 2: ['a']}) q=defaultdict(set) q[0].add('a0') q[0].add('b0') q[0].add('c0') q[1].add('d1') print(q) defaultdict(<class 'set'>, {0: {'b0', 'c0', 'a0'}, 1: {'d1'}})
    • 如果我们想根据某一个字段将数据分组到一个大的数据结构中,并且允许随机访问,可以考虑使用defaultdict( )来构建一个多值字典
    rows = [
        {'address': '5412 N CLARK', 'date': '07/01/2012'},
        {'address': '5148 N CLARK', 'date': '07/04/2012'},
        {'address': '5800 E 58TH', 'date': '07/02/2012'},
        {'address': '2122 N CLARK', 'date': '07/03/2012'},
        {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
        {'address': '1060 W ADDISON', 'date': '07/02/2012'},
        {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
        {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
    ]
    
    from collections import defaultdict
    rows_by_date=defaultdict(list)
    for row in rows:
        rows_by_date[row['date']].append(row)
    print(rows_by_date)
    
    defaultdict(<class 'list'>, 
    {'07/04/2012': [{'date': '07/04/2012', 'address': '5148 N CLARK'}, {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}], 
    '07/02/2012': [{'date': '07/02/2012', 'address': '5800 E 58TH'}, {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}, {'date': '07/02/2012', 'address': '1060 W ADDISON'}], 
    '07/03/2012': [{'date': '07/03/2012', 'address': '2122 N CLARK'}], '07/01/2012': [{'date': '07/01/2012', 'address': '5412 N CLARK'}, {'date': '07/01/2012', 'address': '4801 N BROADWAY'}]})

    setdefault

    p={}
    p.setdefault('1',[]).append('a')
    p.setdefault('1',[]).append('b')
    p.setdefault('2',[]).append('c')
    print(p[0])
        KeyError: 0  #和上面相反,这个并不会占坑
    print(p) {'2': ['c'], '1': ['a', 'b']}

    创建一个多值映射字典

    d = {}
    for key, value in pairs:
        if key not in d:
            d[key] = []
        d[key].append(value)
    
    d = defaultdict(list)
    for key, value in pairs:
        d[key].append(value)
  • 相关阅读:
    Redmine-java-api使用
    Junit4 基于 custom Rule retry
    Extentreports在安卓中的应用
    uiautomator 2.0 自定义testrunner使用
    uiautomator 启动原理
    uiautomator 自定义注解的应用
    uiautomator 原理 (UiAutomation、UiAutomatorBridge、QueryController)
    uiautomator 自定义testrunner使用和启动原理
    HeadFirstPython-文件与异常
    HeadFirstPython-初识python
  • 原文地址:https://www.cnblogs.com/snsdzjlz320/p/7152400.html
Copyright © 2020-2023  润新知