2009-07-03 132 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」相對應的特殊項目。現在只需爲每個特殊元素「 - : - 」順序插入「項目」列表的元素。而且你保持排序,但有一個完整的隨機列表關於每日列表中的任務。