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