Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从列表中选择随机但非最近的资产?_Python_Random_Flask_Queue_Deque - Fatal编程技术网

Python 如何从列表中选择随机但非最近的资产?

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

在我的Flask应用程序中,我遇到了试图从数据库中提取“随机”项的问题。此函数只需返回用户最近未观看的视频。我现在不担心多个用户。我目前的做法行不通。这就是我正在使用的:

@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函数。喜欢这样:去:非常感谢亚伦!