随机列表与规则

时间:2009-07-03 18:23:55

标签: python random

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

一个列表具有单独的日常任务,这些任务不依赖于它们的完成顺序。我把这个名单称为“每日”。我的项目有另一个任务列表,但这些依赖于已完成的订单。此列表称为“项目”。我有一个必须在一天结束时完成的第三个清单。我称之为'endofday'。

所以这是基本规则。

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

我理解如何从random.randint()中获取一个随机数,附加到列表,读取文件以及所有......但逻辑是给我一个'hurty brain'的案例。有人想破解这个吗?

编辑:

好的,我自己解决了这个问题,但至少问这个问题让我把它想象成了我的脑袋。这就是我所做的。

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

感谢您的回答,无论如何,我会给你们一些赞誉!

再次编辑:

废话我刚刚意识到这不是正确答案lol

我最后编辑:

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

我喜欢:

我只是想到当位置有重复值时会发生什么,并且看到我的第一次测试为我的项目返回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

5 个答案:

答案 0 :(得分:4)

首先,每天复制并随机播放以初始化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(random_mix(master, projects))

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

这种插​​入随机性并不理想 - 为此,两个序列之间的选择不应该是等概率的,而是与它们的长度成比例的概率。如果这对您很重要,请通过评论告诉我,我会编辑以解决问题,但我想首先提供一个更简单,更易理解的版本! - )

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

def random_mix_rp(seq_a, seq_b):
    iters = [iter(seq_a), iter(seq_b)]
    lens = [len(seq_a), len(seq_b)]
    while True:
        r = random.randrange(sum(lens))
        itindex = r < lens[0]
        it = iters[itindex]
        lens[itindex] -= 1

        try: yield it.next()
        except StopIteration:
            iters.remove(it)
            it = iters[0]
            for x in it: yield x

当然,其他优化机会出现了 - 因为无论如何我们都在跟踪长度,我们可以依赖于长度已经下降到零而不是尝试/除了检测到一个序列已经完成而我们应该耗尽另一个,等等。但是,我想显示最接近原始版本的版本。以下是利用这一想法进行优化和简化的方法:

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

答案 1 :(得分:1)

使用random.shuffle来混洗列表

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

答案 2 :(得分:1)

如何使用python:

获取列表中的随机元素
>>> import random
>>> li = ["a", "b", "c"]
>>> len = (len(li))-1
>>> ran = random.randint(0, len)
>>> ran = li[ran]
>>> ran
'b'

但似乎你对如何设计它更感兴趣。如果是这样,python标签可能不应该存在。如果没有,问题可能是广泛的,以获得代码方面的任何好答案。

答案 3 :(得分:1)

  1. 将所有3个列表合并为DAG
  2. 执行所有可能的topological sorts,将每种排序存储在列表中。
  3. 从列表中随机选择一个

答案 4 :(得分:1)

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

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