• 字典的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
  • 相关阅读:
    图2(矩环问题)
    图1(八连块)
    恶补一下DP+背包专题(刷刷水题)L2
    food(洛谷P4040 [AHOI2014/JSOI2014]宅男计划)
    滑动窗口
    Lawnmower(洛谷 CF115B)
    Price(洛谷P4109 [HEOI2015]定价)
    逆序对
    矩阵
    1.25日考试
  • 原文地址:https://www.cnblogs.com/sunch/p/10448922.html
Copyright © 2020-2023  润新知