Python 如何简单的在列表被改变的情况下,生成随机但固定的内容 - 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

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

 
  •   v2zero Feb 15, 2021 2103 views
    This topic created in 1912 days ago, the information mentioned may be changed or developed.

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

    一开始想到的办法是通过 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 replies    2021-02-15 19:49:46 +08:00
    noqwerty
        1
    noqwerty  
       Feb 15, 2021
    随机但固定 -> 列表改变仍然展示之前的内容 -> 新增内容永远不被展示 -> 没必要新增内容
    JeffGe
        2
    JeffGe  
       Feb 15, 2021 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  
       Feb 15, 2021
    @JeffGe 我理解的需求是发文章的时候有几篇文章,随机只能是从这几篇文章里挑,无论后续增加多少文章,还是只能从这几篇里挑。这样的话可以用文章的生成时间来先把列表筛出来再随机,但是太重了。

    实际上,随机生成总会带来随机的内容不完全合适的情况,这样总会需要一个字段来手工调整,既然有这个调整字段,不如直接把随机生成的内容直接写死进去,随机只用发布时计算一次,往后都是静态数据,就符合了这个需求,代价反而只是一点点的最不值钱的存储空间。楼主感觉不优雅的方法反而可能是最优雅的
    wd
        4
    wd  
       Feb 15, 2021 via iPhone
    你看样子需要的是 输入的种子是一样的 那么输出的序列是固定的 这样的逻辑?因为你随机的范围是可变的,例如开始是 3 后面变成 4,我感觉没有历史记录的话,似乎不能实现有时候随机,有时候固定的需求。至少需要知道本次 sample 有几个是需要新随机的。
    wd
        5
    wd  
       Feb 15, 2021 via iPhone
    @krixaar 同意。按照目前的需求,似乎只是需要在第一次入库的时候产生随机抽样,然后保存下来。以后也不变了。
    llsquaer
        6
    llsquaer  
       Feb 15, 2021
    是学校摇号程序?
    v2sir
        7
    v2sir  
       Feb 15, 2021
    我觉得, 你先把原数据 random, 再把 docs.append() 新增数据不就行了,按你的意思,你新增的数据也随机 不到啊?
    如果 随机数据也增加,可根据具体情况 递归、循环 remove,random 。 我就提个想法昂。
    v2sir
        8
    v2sir  
       Feb 15, 2021
    也不知道是不是你的需求
    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)
    About     Help     Advertise     Blog     API     FAQ     Solana     3354 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 13:06 PVG 21:06 LAX 06:06 JFK 09:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86