2009-07-03 5 views
0

私はいくつかのテキストファイルから読み込んだタスクのリストを作成してリストに入れようとしています。私はその日を通して何をしようとしているのかのマスターリストを作成したいが、これについてはいくつかのルールがある。ルール付きランダムリスト

1つのリストには、完了した順序に依存しない別々の日常的なタスクがあります。私はこのリストを「毎日」と呼んでいます。私は自分のプロジェクトの別のタスクリストを持っていますが、これは完了した注文に依存します。このリストは「プロジェクト」と呼ばれます。私は、日の終わりにやらなければならないことの3番目のリストを持っています。私はそれを「endofday」と呼ぶ。

ここに基本ルールがあります。

任意の順序で日常のタスクを実行できる任意のタスクのリストです。プロジェクトタスクは任意の位置でメインリストに無作為に挿入できますが、互いに対して元の順序にとどまる必要があります。メインリストに追加されます。

私はrandom.randint()から乱数を得る方法を理解しています。リストに追加してファイルを読み込んでいますが、そのロジックは私に「ハーティーな脳」のケースを与えています。誰もがこれに亀裂をしたいですか?

EDIT:

[OK]を私は自分自身でそれを解決したが、少なくとも質問をすることは私の頭の中でそれを描くために私を得ました。ここに私がしたことがあります。

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 

回答ありがとうございます。私はあなたにいくつかの名誉を与えます。 AGAIN

編集:私はちょうどそれが正しい答えではありません実現

クラップ笑

私はSWEAR LAST EDIT:

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笑回答のソリューションを使用するつもりです:リストに

random.shuffleをシャッフルする

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

中間バージョンを削除してください。あなたの質問にFINALバージョンで答えてください。歴史は興味深いものではありません。質疑応答は面白いです。 –

答えて

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))

パフォーマンスは、ここで生成された乱数のロット(理想的ではないとなりたとえば、もっと少ないもので済むかもしれませんが、数十、数百のアイテムについて話していれば問題ありません。

この挿入ランダム性は理想的ではありません。そのため、2つのシーケンス間の選択は等確率ではなく、その長さに比例した確率で行うべきです。それはあなたにとって重要なら、私はコメントで知っていると私は問題を解決するために編集しますが、私は、よりシンプルで理解しやすいバージョンを提供するために最初たかった - )

編集:!受け入れるためのおかげで、とにかく、正しい確率を使用する「ランダムな混合保存順序」の別の方法で答えを完成させてください。ちょうど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 

ここで発生する - 私たちはとにかく長さを追跡していることから、我々はゼロにダウンしてではなく、試しにした長さに依存している可能性があり/ 1シーケンスが終了したことを検出する以外と私たちは他のものを使い果たすべきです。しかし、私はオリジナルのものに最も近いバージョンを表示したかったのです。ここで最適化し、簡素化するためにこのアイデアを利用し1だ:

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を([ "X"、 " Y」、 "Z"])のpythonを使用して、リスト内のランダムな要素を取得する方法

1

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

しかし、それはよそうですあなたはこれをどのように設計するかについてもっと興味があります。もしそうなら、pythonタグはおそらく存在しないはずです。もしそうでなければ、問題は広範に及ぶでしょう。

+1

え? Pythonのランダムモジュールとそれに特有のリストとジェネレータのアプローチは、これをどのように設計するのが良いか(私の答えを見てください)、Pythonコードは本質的にデザインを表現しています... –

+0

この作業は、 Python言語では、デザインをコーディングする際に助けが必要だった場合や、最初にデザインを手助けする必要がある場合は、少し混乱しました。どちらも有効な質問ですが、同時に両方に質問するのはちょっと難しいかもしれません。 – Mizipzor

1
  1. DAG
  2. にすべての3つのリストを結合可能なすべての​​を実行し、リスト内の各ソートを格納します。
  3. あなたは次の操作を行うことができ、順番に滞在する「プロジェクト」リストの要素ためにはランダム
1

のリストからいずれかを選択します。 はあなたが4つのプロジェクトタスクを持っていると言う:「、B 、c、d "となる。次に、ランダムに選択された他の要素を挿入することができる5つの点があることがわかります(開始点と終了点を含む各要素の前後)。順序は自然に変わりません。

次に、日常的なリストに特別な要素(「 - : - 」など)を5回追加できます。毎日のリストをシャッフルすると、上記の "a、b、c、d"に対応するこれらの特別なアイテムがランダムに配置されます。これで、特別な要素 " - : - "ごとに "projects"リストの要素を順番に挿入するだけです。そしてあなたは注文を保ちながら、毎日のリストからのタスクに関する完全にランダムなリストを持っています。

+0

エラー、私は特別な要素の4倍を意味します。それ以外の場合、それは一致しません... –