2011-07-11 10 views
1

今日、私がここで得た答えに基づいて、この小さなコードを書いて、16個の要素のランダムなリストを作成しました。リストをExcel互換のファイルにエクスポートするにはどうすればよいですか?

import random 

sources = ['Prone', 'Supine', 'Halfway', 'HalfInv'] 
result = [random.choice(sources)] 
repeats = 0 
fail = 0 

while len(result) < 16: 
    elem = random.choice(sources) 
    repeats = result.count(elem) 
    print(repeats) 
    if (elem != result[-1]) & (repeats < 4): 
     result.append(elem) 
    else: 
     fail = fail + 1 
     print(fail) 
     if fail > 100: 
      result = [random.choice(sources)] 

print(result) 

今私がやりたいものです:(?どのように私はループカウンタのために基づいてこれを行うのです)、これらを別の名前の2つのランダムなリストを作成する 1. 2.として、これらの2つのリストを置きます列をタブ区切り(txt)ファイル内に作成し、そのファイルをExcelファイルに簡単にコピーして貼り付けることができます。私はCSVモジュールを調べましたが、行のメソッドしかないようです。

答えて

1

あなたは4・オブ・各ソースからのあなたのリストの要素ののランダム順序付きリストを取得するためのより効率的な方法を探しているなら、random.shuffle(list)を試してみてください。

>>> import random 
>>> random.seed() 
>>> sources = ['Prone', 'Supine', 'Halfway', 'HalfInv'] 
>>> copy1 = sources * 4 
>>> copy2 = sources * 4 
>>> copy1 == copy2 
True 
>>> random.shuffle(copy1) 
>>> random.shuffle(copy2) 
>>> copy1 == copy2 
False 
>>> copy1 
['HalfInv', 'Prone', 'Halfway', 'Supine', 'Prone', 'Halfway', 'Prone', 'Supine', 'Prone', 'HalfInv', 'HalfInv', 'Halfway', 'Supine', 'Halfway', 'HalfInv', 'Supine'] 
>>> copy2 
['Prone', 'Halfway', 'Prone', 'Prone', 'HalfInv', 'Halfway', 'Halfway', 'HalfInv', 'Supine', 'HalfInv', 'Halfway', 'Supine', 'Prone', 'Supine', 'HalfInv', 'Supine'] 

次は、生成したいとループカウンタに基づいてリストに名前を付けてください...私はこれに対してお勧めしたいと思います。代わりにランダムリストを1つずつリストに追加するだけで、追加された順序でインデックスに登録することができます。

>>> n = 2 # number of random lists you want 
>>> rand_lists = [] # A list for holding your randomly generated lists 
>>> for i in range(n): 
    sources_copy = sources * 4 
    random.shuffle(sources_copy) 
    rand_lists.append(sources_copy) 

ただし、データが2つの別々のリストにあるという問題が残ります。これを解決するには、zip()機能が必要です。これは、リスト1の各要素をリスト2の対応する索引要素と結合し、各索引にタプルを形成します。これは、任意の数のシーケンスで行うことができます。

>>> list1 = [1,2,3,4,5] 
>>> list2 = ['a','b','c','d','e'] 
>>> zip(list1, list2) 
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')] 

あなたのメタリストの名前の前に*星開梱演算子を使用し、一緒にあなたのリスト-内-リストを圧縮します。

>>> my_data = zip(*rand_lists) 

これでcsvファイルに出力します。独自のcsv関数を書くだけで十分です。列の区切り記号はコンマで、行の区切り記号は改行記号です。ここから

def out_csv(mydata, filename): 
    with open(filename, 'w') as out_handle: 
     for line in mydata: 
      out_handle.write(','.join(line) + '\n') 

だけout_csv機能にあなたのzip形式のリストのコンボを渡し、そしてあなたのファイル名が.csv拡張子を持っていることを確認してください。 Excelはネイティブで.csvのファイルを読み取ることができるので、コピー&ペーストをする必要はありません。

ここで最後のステップです:このような何かが動作するはず

>>> out_csv(my_data, 'my_name.csv') 
+0

@ user747465:これはもっと論理的な順序にする必要があります。乾杯! –

+0

random.shuffleは自分自身を試した最初のものですが、制約を強制する必要があるために動作しません2つの同じ要素が連続していないこと。 –

+0

良い、私は強制するために必要な制約のため、私は元のバージョンに適応し、それは完全に働いた。 –

0

: (私は少し2つのリストにあなたのプログラムを微調整しますが、一般的な「要旨」と同じに保つことを試みた)

import random 

sources = ['Prone', 'Supine', 'Halfway', 'HalfInv'] 
#result = [random.choice(sources)] 
result = {1:[], 2:[]} 
#repeats = 0 
#fail = 0 

for part in result: 
    fail = 0 
    repeats = 0 
    while len(result[part]) < 16: 
     elem = random.choice(sources) 
     repeats = result[part].count(elem) 
     print(repeats) 
     if (not result[part]) or ((elem != result[part][-1]) & (repeats < 4)): 
      result[part].append(elem) 
     else: 
      fail = fail + 1 
      print(fail) 
      if fail > 100: 
       result[part] = [] 

print(result) 



with open('somefile.csv','wb') as f: 
    #f.write('\r\n'.join('%s\t%s' % (a,b) for a, b in zip(result[1], result[2]))) 
    f.write(bytes('\r\n'.join('%s\t%s' % (a,b) for a, b in zip(result[1], result[2])), 'UTF-8')) 
+0

コードでエラー "TypeError: 'str'がバッファインターフェイスをサポートしていません。 –

+0

@ user747465:申し訳ありませんが、私はPython 2.7を使用しています。私は思う*私はPython 3のためにそれを修正した(しかし、チェックする必要はありません)。 – Gerrat