字典的setdefault方法

Python 字典 setdefault() 函数和get() 方法类似, 

语法:

dict.setdefault(key, default=value)

如果键(key)不存在于字典中,将会添加键(key)并将值设为默认值(value)。

如果键(key)已经存在, 则什么也不做

实例:

dict = {'runoob': '菜鸟教程', 'google': 'Google 搜索'}
 
print "Value : %s" %  dict.setdefault('runoob', None)
print "Value : %s" %  dict.setdefault('Taobao', '淘宝')

代码:

# longer.. harder to read
values = {}
for element in iterable:
    if element not in values:
        values[element] = []
    values[element].append(other_value)

# better.. use dict.setdefault method
values = {}
for element in iterable:
    values.setdefault(element, []).append(other_value)
# 将data的数据更新到stack中的列表中
data = {'电影': '上帝之城', '动漫': '灌篮高手', '电视剧': '权利的游戏'}
stack = {'电影': ['肖申克的救赎', '这个杀手不太冷']}

# 方式一  low
for element in data:
    # element = user, user1, user2
    if element not in stack:
        stack[element] = []
    stack[element].append(data[element])

# 方式二  better
for element in data:
    stack.setdefault(element, []).append(data[element])

print(stack)  # {'电影': ['肖申克的救赎', '这个杀手不太冷', '上帝之城'], '动漫': ['灌篮高手'], '电视剧': ['权利的游戏']}

扩展应用场景

逻辑:

1 以用户的唯一标示为键,再以用户的访问记录的列表为值

2 在用户下一次访问时判断列表的最后一个时间戳是否小于(当前时间-频率时间);如果小于,则剔除;

3 然后再判断列表的长度时候超过频率数,如超过,则return false,else true

数据结构:

{
192.168.1.2:[234234234,234234228,234234210],
192.168.1.3:[234234234,234234228,234234210],
}

代码实现

class VisitThrottleBetter(BaseThrottle):
    """优化过代码的频率限制类"""

    def __init__(self):
        self.visited_record = None

    def allow_request(self, request, view):
        """在allow_request中编写频率业务逻辑"""
        remote_addr = request.META.get('REMOTE_ADDR')
        # print(remote_addr)
        ctime = time.time()

        # 1 有记录来则将其添加到访问记录里
        VISIT_RECORD.setdefault(remote_addr, []).insert(0, ctime)

        # 2 判断列表的最后一个是否小于(当前时间-频率时间);如果小于,则剔除;
        self.visited_record = VISIT_RECORD.get(remote_addr)
        while self.visited_record and self.visited_record[-1] < ctime - 60:
            self.visited_record.pop()

        # 3 然后再判断列表的长度是否超过频率数,如不超过,则return true,else false
        if len(self.visited_record) <= 3:
            # /不超过频率数
            return True
        else:
            # /超过频率数
            return False

    def wait(self):
        """如果allow_request中没有通过, wait里写再等多少秒就可以访问了"""
        ctime = time.time()
        first_visit_duration = ctime - self.visited_record[-1]      # 现在离第一次访问过了多久啦
        return 60 - first_visit_duration
原文地址:https://www.cnblogs.com/sunch/p/10448922.html