V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
v2zero
V2EX  ›  Python

Python 如何简单的在列表被改变的情况下,生成随机但固定的内容

  •  
  •   v2zero · 2021-02-15 01:25:32 +08:00 · 1550 次点击
    这是一个创建于 1138 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是,在网站上以随机的匹配逻辑来展现相关文章区域的内容。不同页面之间需要展现不同的内容,但同一个页面上面,需要固定展示某几条匹配内容。

    一开始想到的办法是通过 random.seed 实现,但发现并不够用。

    import random
    docs = [1,2,3]
    random.seed(1) # 以当前 doc_id 为 seed
    relate_docs = random.sample(docs, 2)
    # [1, 3]
    

    当 docs 本身被改变时:

    docs = [1,2,3,4]
    random.seed(1) # 以当前 doc_id 为 seed
    relate_docs = random.sample(docs, 2)
    # [2, 3]
    

    我知道这样的结果是合理的,但仍希望找到一种简单的方式,使得在列表变化的时候,输出仍然会是前面的[1,3]

    感觉上应该没有特别简单的实现方法,但毕竟目前的解决方案着实不理想。

    目前采取的凑合办法,是每一个 doc 的数据库条目里面去写死它需要展现的随机 n 条内容,这实在是太不优雅。现在情况下,初始数据入库、增量数据更新和页面展现几块的代码都得有这个处理流程,给维护也添加了些许麻烦。

    我不是专业做技术的,所以问题可能比较小白。尝试搜索无果(这个问题也不容易被几个词来描述),因此提问求教,感谢诸位。

    8 条回复    2021-02-15 19:49:46 +08:00
    noqwerty
        1
    noqwerty  
       2021-02-15 01:44:38 +08:00
    随机但固定 -> 列表改变仍然展示之前的内容 -> 新增内容永远不被展示 -> 没必要新增内容
    JeffGe
        2
    JeffGe  
       2021-02-15 08:45:00 +08:00 via Android
    不知道是不是我理解错了,你的需求是
    [1] -> [1]
    [1, 2] -> [1, 2]
    [1, 2, 3] -> [1, 2, 3]
    [1, 2, 3, 4] -> [1, 2, 3, 4]
    krixaar
        3
    krixaar  
       2021-02-15 09:17:50 +08:00
    @JeffGe 我理解的需求是发文章的时候有几篇文章,随机只能是从这几篇文章里挑,无论后续增加多少文章,还是只能从这几篇里挑。这样的话可以用文章的生成时间来先把列表筛出来再随机,但是太重了。

    实际上,随机生成总会带来随机的内容不完全合适的情况,这样总会需要一个字段来手工调整,既然有这个调整字段,不如直接把随机生成的内容直接写死进去,随机只用发布时计算一次,往后都是静态数据,就符合了这个需求,代价反而只是一点点的最不值钱的存储空间。楼主感觉不优雅的方法反而可能是最优雅的🤣
    wd
        4
    wd  
       2021-02-15 09:27:12 +08:00 via iPhone
    你看样子需要的是 输入的种子是一样的 那么输出的序列是固定的 这样的逻辑?因为你随机的范围是可变的,例如开始是 3 后面变成 4,我感觉没有历史记录的话,似乎不能实现有时候随机,有时候固定的需求。至少需要知道本次 sample 有几个是需要新随机的。
    wd
        5
    wd  
       2021-02-15 09:29:45 +08:00 via iPhone
    @krixaar 同意。按照目前的需求,似乎只是需要在第一次入库的时候产生随机抽样,然后保存下来。以后也不变了。
    llsquaer
        6
    llsquaer  
       2021-02-15 15:43:48 +08:00
    是学校摇号程序?
    v2sir
        7
    v2sir  
       2021-02-15 18:04:44 +08:00
    我觉得, 你先把原数据 random, 再把 docs.append() 新增数据不就行了,按你的意思,你新增的数据也随机 不到啊?
    如果 随机数据也增加,可根据具体情况 递归、循环 remove,random 。 我就提个想法昂。
    v2sir
        8
    v2sir  
       2021-02-15 19:49:46 +08:00
    也不知道是不是你的需求
    import random
    docs = [i for i in range(48)]
    random.seed(1) # 以当前 doc_id 为 seed
    n1 = 10
    n2 = 2
    doc2 = [docs[i:i+n1] for i in range(0,len(docs),n1) if len(docs[i:i+n1])==n1]

    relate_docs = sum([random.sample(i,n2) for i in doc2],[])
    print(relate_docs)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5571 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:36 · PVG 14:36 · LAX 23:36 · JFK 02:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.