Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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 - Fatal编程技术网

Python 带规则的随机列表

Python 带规则的随机列表,python,random,Python,Random,我试图创建一个从一些文本文件中读取的任务列表,并将它们放入列表中。我想创建一个我一天要做的事情的主列表,但是我有一些规则 一个列表有独立的日常任务,不取决于它们完成的顺序。我把这份清单称为“每日”。我已经为我的项目列出了另一个任务列表,但这些任务确实取决于完成的顺序。此列表称为“项目”。我还有第三张清单,上面列出了一天结束时必须做的事情。我称之为“endofday” 以下是基本规则 随机任务列表,其中日常任务可按任何顺序执行,项目任务可随机插入主列表的任何位置,但必须保持其相对于彼此的原始顺序,

我试图创建一个从一些文本文件中读取的任务列表,并将它们放入列表中。我想创建一个我一天要做的事情的主列表,但是我有一些规则

一个列表有独立的日常任务,不取决于它们完成的顺序。我把这份清单称为“每日”。我已经为我的项目列出了另一个任务列表,但这些任务确实取决于完成的顺序。此列表称为“项目”。我还有第三张清单,上面列出了一天结束时必须做的事情。我称之为“endofday”

以下是基本规则

随机任务列表,其中日常任务可按任何顺序执行,项目任务可随机插入主列表的任何位置,但必须保持其相对于彼此的原始顺序,以及附加到主列表的日终任务

我知道如何从random.randint()中得到一个随机数,添加到列表中,读取文件等等……但逻辑给了我一个“大脑受伤”的例子。有人想试试这个吗

编辑:

好吧,我自己解决了这个问题,但至少问这个问题让我在脑海里想象了一下。这就是我所做的

random.shuffle(daily)
while projects:
    daily.insert(random.randint(0,len(daily)), projects.pop(0))
random.shuffle(endofday)
daily.extend(endofday)
for x in daily: print x
谢谢你的回答,无论如何,我会给你们一些荣誉的

再次编辑:

废话我才意识到这不是正确的答案哈哈

最后,我发誓:

position = []
random.shuffle(daily)
for x in range(len(projects)):
    position.append(random.randint(0,len(daily)+x))
position.sort()
while projects:
    daily.insert(position.pop(0), projects.pop(0))
random.shuffle(endofday)
daily.extend(endofday)
for x in daily: print x
我撒谎说:

我只是在想当position有重复的值时会发生什么,瞧,我的第一个测试为我的项目返回了1,3,2,4。我要接受它,并使用回答者的解决方案lol

或否:

position = []
random.shuffle(daily)
for x in range(len(projects)):
    while 1:
        pos = random.randint(0,len(daily)+x)
        if pos not in position: break
    position.append(pos)
position.sort()
while projects:
    daily.insert(position.pop(0), projects.pop(0))
random.shuffle(endofday)
daily.extend(endofday)
for x in daily: print x

使用random.shuffle洗牌来洗牌列表


random.shuffle([“x”、“y”、“z”])

如何使用python获取列表中的随机元素:

>>> import random
>>> li = ["a", "b", "c"]
>>> len = (len(li))-1
>>> ran = random.randint(0, len)
>>> ran = li[ran]
>>> ran
'b'

但你似乎更好奇如何设计这个。如果是这样的话,python标记可能不在那里。如果没有,问题可能会很广泛,以便在代码方面为您提供任何好的答案。

首先,每天复制并洗牌以初始化master:

master = list(daily)
random.shuffle(master)
然后(有趣的部分!-)更改master(随机插入项目,但不更改顺序),最后
random.shuffle(endofday);master.extend(endofday)

正如我所说,变更部分是有趣的一部分——关于:

def random_mix(seq_a, seq_b):
    iters = [iter(seq_a), iter(seq_b)]
    while True:
        it = random.choice(iters)
        try: yield it.next()
        except StopIteration:
            iters.remove(it)
            it = iters[0]
            for x in it: yield x
现在,混合步骤变成了
master=list(随机混合(master,projects))

性能并不理想(例如,这里生成大量随机数,我们可以用更少的随机数),但如果我们谈论几十个或数百个项目,则性能很好

这种插入随机性并不理想——因此,两个序列之间的选择不应该是等概率的,而是概率与其长度成正比的。如果这对您很重要,请让我知道并发表评论,我将进行编辑以解决问题,但我想首先提供一个更简单、更易懂的版本!-)

编辑:感谢您的接受,让我用另一种“随机混合保留顺序”的方式来完成答案,这种方式使用了正确的概率——只是稍微复杂一点,因为它不能直接调用
random.choice
;-)

def random_mix_rp(顺序a、顺序b):
国际热核实验堆=[国际热核实验堆(顺序a),国际热核实验堆(顺序b)]
镜头=[镜头(顺序a),镜头(顺序b)]
尽管如此:
r=随机随机随机范围(总和(镜头))
itindex=r
当然,这里还会出现其他优化机会——因为我们无论如何都在跟踪长度,所以我们可以依赖长度下降到零,而不是尝试/除了检测一个序列是否完成,我们应该耗尽另一个序列,等等。但是,我想显示最接近原始序列的版本。下面是一个利用这一思想进行优化和简化的例子:

def random_mix_rp1(seq_a, seq_b):
    iters = [iter(seq_a), iter(seq_b)]
    lens = [len(seq_a), len(seq_b)]
    while all(lens):
        r = random.randrange(sum(lens))
        itindex = r < lens[0]
        it = iters[itindex]
        lens[itindex] -= 1
        yield it.next()
    for it in iters:
        for x in it: yield x
def随机混合rp1(顺序a、顺序b):
国际热核实验堆=[国际热核实验堆(顺序a),国际热核实验堆(顺序b)]
镜头=[镜头(顺序a),镜头(顺序b)]
而所有(镜头):
r=随机随机随机范围(总和(镜头))
itindex=r
  • 将所有3个列表合并为一个DAG
  • 执行所有可能的操作,将每个排序存储在列表中
  • 从列表中随机选择一个

  • 为了使“项目”列表的元素保持有序,您可以执行以下操作: 假设你有4个项目任务:“a,b,c,d”。然后您知道有五个点可以插入其他随机选择的元素(在每个元素之前和之后,包括开始和结束),而顺序自然保持不变


    接下来,您可以在每日列表中添加五次特殊元素(例如“-:-”)。当你现在洗牌每日列表时,这些特殊的项目,对应于上面的“a,b,c,d”,是随机放置的。现在您只需为每个特殊元素“-:-”按顺序插入“projects”列表中的元素。您保留了订单,但有一个关于每日列表中任务的完全随机列表。

    Uh?Python的随机模块及其对列表和生成器的特定方法与如何最好地进行设计(请参见我的答案)有着密切的关系,Python代码本质上表达了设计……虽然您认为此任务非常适合Python语言,但如果他想帮助编写设计,我有点困惑,或者如果他一开始需要设计方面的帮助。这两个问题都是有效的,但同时问这两个问题可能有点过分。请删除中间版本。请用最终版本回答您的问题。历史并不有趣。这个问题和答案很有趣。
    def random_mix_rp1(seq_a, seq_b):
        iters = [iter(seq_a), iter(seq_b)]
        lens = [len(seq_a), len(seq_b)]
        while all(lens):
            r = random.randrange(sum(lens))
            itindex = r < lens[0]
            it = iters[itindex]
            lens[itindex] -= 1
            yield it.next()
        for it in iters:
            for x in it: yield x