python dict: get vs setdefault

前端 未结 8 1085
误落风尘
误落风尘 2020-12-04 15:04

The following two expressions seem equivalent to me. Which one is preferable?

data = [(\'a\', 1), (\'b\', 1), (\'b\', 2)]

d1 = {}
d2 = {}

for key, val in d         


        
8条回答
  •  遥遥无期
    2020-12-04 15:53

    The logic of dict.get is:

    if key in a_dict:
        value = a_dict[key] 
    else: 
        value = default_value
    

    Take an example:

    In [72]: a_dict = {'mapping':['dict', 'OrderedDict'], 'array':['list', 'tuple']}
    In [73]: a_dict.get('string', ['str', 'bytes'])
    Out[73]: ['str', 'bytes']
    In [74]: a_dict.get('array', ['str', 'byets'])
    Out[74]: ['list', 'tuple']
    

    The mechamism of setdefault is:

        levels = ['master', 'manager', 'salesman', 'accountant', 'assistant']
        #group them by the leading letter
        group_by_leading_letter = {}
        # the logic expressed by obvious if condition
        for level in levels:
            leading_letter = level[0]
            if leading_letter not in group_by_leading_letter:
                group_by_leading_letter[leading_letter] = [level]
            else:
                group_by_leading_letter[leading_letter].append(word)
        In [80]: group_by_leading_letter
        Out[80]: {'a': ['accountant', 'assistant'], 'm': ['master', 'manager'], 's': ['salesman']}
    

    The setdefault dict method is for precisely this purpose. The preceding for loop can be rewritten as:

    In [87]: for level in levels:
        ...:     leading = level[0]
        ...:     group_by_leading_letter.setdefault(leading,[]).append(level)
    Out[80]: {'a': ['accountant', 'assistant'], 'm': ['master', 'manager'], 's': ['salesman']}
    

    It's very simple, means that either a non-null list append an element or a null list append an element.

    The defaultdict, which makes this even easier. To create one, you pass a type or function for generating the default value for each slot in the dict:

    from collections import defualtdict
    group_by_leading_letter = defaultdict(list)
    for level in levels:
        group_by_leading_letter[level[0]].append(level)
    

提交回复
热议问题