2009-07-03 74 views
0

我想创建一个任务列表,我已经从一些文本文件中读取并将它们放入列表中。我想创建一个我将在一天中完成的主要清单,但是我对此有一些规则。随机列表与规则

一个列表具有不依赖于完成顺序的单独日常任务。我把这个清单称为“每日”。我已经为我的项目准备了另一份任务清单,但这些清单取决于完成的订单。这个名单被称为'项目'。我有第三个必须在一天结束时做的事情清单。我称之为'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 

我LIED:

我只是想过会发生什么当职位有重复的价值观,并且看我的第一次测试返回1,3,2,4为我的项目。我要吮吸它,并使用回答者的解决方案笑

OR NOT:

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 
+1

请删除中间版本。请用最终版本回答你的问题。历史不是很有趣。问题和答案很有趣。 – 2009-07-03 19:20:28

回答

4

首先,复制和洗牌日常初始化主:

master = list(daily) 
random.shuffle(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

使用random.shuffle洗牌列表

random.shuffle([ “X”,“ Y”, “Z”])

1

如何使用Python获取列表中的一个随机元素:

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

但似乎哟你更好奇如何设计这个。如果是这样,python标签可能不应该在那里。如果不是的话,这个问题可能会广泛地给你任何代码明智的答案。

+1

呃? Python的随机模块及其对列表和生成器的具体方法与如何最好地设计这个(见我的答案)和Python代码本质上表达了设计密切相关...... – 2009-07-03 18:38:32

+0

虽然你认为这个任务非常适合Python语言,如果他想要帮助编写设计代码,或者他首先需要设计帮助,我有点困惑。这两个问题都是有效的问题,但同时询问两者可能会有所帮助。 – Mizipzor 2009-07-03 18:51:05

1
  1. 将所有3所列出成DAG
  2. 执行所有可能​​,存储在列表中的每个排序。
  3. 选择从列表中随机
1

为了“项目”列表中的元素留在顺序,你可以做到以下几点: 说你有4级项目的任务:“A,B ,光盘”。然后你知道有五个点可以插入其他随机选择的元素(每个元素之前和之后,包括开始和结束),而排序自然保持不变。

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