【问题标题】:Random match-up with Python and Google App Engine与 Python 和 Google App Engine 的随机匹配
【发布时间】:2014-04-02 22:23:11
【问题描述】:

我正在建立一个网站,从数据库中随机选择两个音乐视频并进行正面交锋进行投票。我需要一种算法,该算法将继续为用户挑选独特的比赛,不包括他们过去的比赛,但会为新的比赛替换视频。您可以在此处查看页面示例:http://10.showtownmvp.appspot.com/

我在 Google App Engine - Python 上运行它,并且有一个投票表和视频表来存储结果。我想尽可能保持随机并避免多次查询,所以如果您对如何在 NDB 中建模或有一个好的算法有建议,我将不胜感激!

【问题讨论】:

  • 您不能只从数据存储区请求随机实体。你有多少视频?对于非常小的数据集,您可以获取所有键,然后只需执行random.choice(keys)
  • 您预计将拥有多少个视频

标签: python algorithm google-app-engine


【解决方案1】:

我对这个问题的解决方案是从数据存储中查询所有视频并随机选择一个。我还为用户查询了过去的投票/比赛,并将其转换为一个列表,这样我就可以在不运行多个查询的情况下对其进行操作。使用随机视频,我使用了一个 while 循环来查找第二个视频,该视频不在之前的匹配列表中。如果没有找到视频,程序将从视频列表中删除随机选择,然后选择一个新样本并再次运行搜索。代码如下:

    class MainHandler(views.Template):              

        def post(self):
            # NOTE: we are posting genre and state.
            user = self.user_check()
            self.videos = models.videos.Videos.fetch_featured()

            try:
                random.sample(self.videos,2)

                if user:
                    self.user_votes = models.voting.Voting.query_by_user(user.key)

                    if self.user_votes != None:
                        self.user_votes = [[x.video_one,x.video_two] for x in self.user_votes]
                        page_vids = False
                        while page_vids == False and len(self.videos)>1:
                            rand_vid = random.choice(self.videos)
                            page_vids = self.find_match(rand_vid)
                            self.videos.remove(rand_vid)
                    else:
                        page_vids = random.sample(self.videos,2)

                else:
                    page_vids = random.sample(self.videos,2)

            except:
                page_vids = None


        def find_match(self, rand_vid):
            i =0

            while i < len(self.videos):
                if rand_vid.key != self.videos[i].key and ([rand_vid.key,self.videos[i].key] not in self.user_votes and [self.videos[i].key, rand_vid.key] not in self.user_votes):
                    return [rand_vid,self.videos[i]]
                i+=1
            return False




    class Videos(ndb.Model):
        acc_key = ndb.KeyProperty()
        musician_key = ndb.KeyProperty()
        musician_name = ndb.StringProperty()
        embed_link = ndb.StringProperty()
        genre_tag = ndb.StringProperty()
        video_title = ndb.StringProperty()
        featured = ndb.BooleanProperty(default = False)
        likes_count = ndb.IntegerProperty()
        video_added = ndb.DateTimeProperty(auto_now_add = True)

        @classmethod
        def query_by_account(cls, acc_key):
            return cls.query(cls.acc_key == acc_key).fetch()

        @classmethod
        def fetch_featured(cls):
            return cls.query(cls.featured == True).fetch(100)


class Voting(ndb.Model):
        voter_acc_key = ndb.KeyProperty()
        voter_type = ndb.StringProperty()
        video_one = ndb.KeyProperty()
        video_one_artist_key = ndb.KeyProperty()
        video_two = ndb.KeyProperty()
        video_two_artist_key = ndb.KeyProperty()
        voter_choice = ndb.KeyProperty()
        video_set_check = ndb.KeyProperty(repeated = True)
        voter_ip = ndb.StringProperty()
        vote_time = ndb.DateTimeProperty(auto_now_add = True)


        @classmethod
        def query_by_user(cls, acc_key):
            return cls.query(cls.voter_acc_key == acc_key).fetch(2000)

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2012-07-04
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多