Python 如何从列表中选择随机但非最近的资产?
在我的Flask应用程序中,我遇到了试图从数据库中提取“随机”项的问题。此函数只需返回用户最近未观看的视频。我现在不担心多个用户。我目前的做法行不通。这就是我正在使用的:Python 如何从列表中选择随机但非最近的资产?,python,random,flask,queue,deque,Python,Random,Flask,Queue,Deque,在我的Flask应用程序中,我遇到了试图从数据库中提取“随机”项的问题。此函数只需返回用户最近未观看的视频。我现在不担心多个用户。我目前的做法行不通。这就是我正在使用的: @app.route('/_new_video') def new_video(): 这是我要问的重要部分: current_id = request.args.get('current_id') video_id = random.choice(models.Video.query.all()) # ret
@app.route('/_new_video')
def new_video():
这是我要问的重要部分:
current_id = request.args.get('current_id')
video_id = random.choice(models.Video.query.all()) # return list of all video ids
while True:
if video_id != current_id:
new_video = models.Video.query.get(video_id)
然后我把它还给你:
webm = new_video.get_webm() #returns filepath in a string
mp4 = new_video.get_mp4() #returns filepath in a string
return jsonify(webm=webm,mp4=mp4,video_id=video_id)
随机范围从1开始,因为第一个资产已从数据库中删除,因此数字0与id不关联。理想情况下,用户不会获得他们最近观看的视频。我建议使用
collections.deque
存储最近观看的列表。它保存一个类似列表的项目集合,当您添加到其中时,如果它达到最大长度,它会自动删除最旧的项目,以先进先出的方式进行
import collections
这是一个生成器,你可以用它来获取最近没有看过的随机视频。denom参数将允许您更改最近观看列表的长度,因为它用于确定最近观看列表的最大长度,作为视频列表的一部分
def gen_random_vid(vids, denom=2):
'''return a random vid id that hasn't been recently watched'''
recently_watched = collections.deque(maxlen=len(vids)//denom)
while True:
selection = random.choice(vids)
if selection not in recently_watched:
yield selection
recently_watched.append(selection)
我将创建一个快速列表来演示它:
vids = ['vid_' + c for c in 'abcdefghijkl']
下面是用法:
>>> recently_watched_generator = gen_random_vid(vids)
>>> next(recently_watched_generator)
'vid_e'
>>> next(recently_watched_generator)
'vid_f'
>>> for _ in range(10):
... print(next(recently_watched_generator))
...
vid_g
vid_d
vid_c
vid_f
vid_e
vid_g
vid_a
vid_f
vid_e
vid_c
此函数与我的routes放在一个单独的文件中并导入。然后,我在程序的前端初始化了生成器,并将其提供给route函数。喜欢这样:去:非常感谢亚伦!