2017-07-14 22 views
0

せずに変数サイズの複数の他のリストに1つのリストから内容を追加します。私が項目のリストを持っていると言う:は繰り返し

l1 = ['a','b','c',d','e','f','g'] 

は今、私は何をしたいことは、ランダムにnには、このリストの内容を分割することです(例えば、l3は長さ3であり、l3は長さ3であり、l4は長さ1である)リストの数(例えばn = 3)は繰り返されない。すなわち

l2 = ['a','d','e'] 
l3 = ['b','f',g'] 
l4 = ['c'] 

このようなことはどのように達成できますか?ありがとう。

+0

私はこのリンクが役立つと思います[分割リスト](https://stackoverflow.com/a/752562/5161074) –

答えて

2

一つのアプローチは、ランダムにリストをシャッフルし、その後、必要なサイズに分割することです:

import random 

l1 = ['a', 'b', 'c', 'd','e','f','g'] 

# put the list into a random order 
random.shuffle(l1) 

l2 = l1[:3] # first three elements 
l3 = l1[3:6] # second three elements 
l4 = l1[6:] # final element 

print(l2) 
print(l3) 
print(l4) 

# Sample output: 
# ['d', 'e', 'a'] 
# ['g', 'b', 'c'] 
# ['f'] 
+0

パフォーマンスが問題になる場合は、 'i = np.random.permutation(len(l1))'を実行してから 'l2 = l1 [i [:3]]'などを実行することもできます。かなり遅い。欠点は、サブリストがメモリ連続である必要がある(つまり、配列の要素のためにメモリを狩りに苦しむことになるベクトル化操作を後で実行するベクトル化された操作がある)場合は、配列を並べ替える必要があるということです。 –

+0

「ベクトル化演算」とはどういう意味ですか? –

+0

'for'ループのない操作(基本的には「隠蔽」さえ)は基本的に(*非常に*)です。一度にリスト/アレイ/ etc全体で動作するもの。これらのタイプの操作は、RAM全体を狩ることなく、メモリ内の1つのブロックにあるデータをよりうまく処理できるため、最初にインプレースのシャッフルを実行する価値があります。あなたの後続機能が、一度に1つの要素をリストで消費している場合、それらをRAM内で連続して並べ替える価値はありません。通常、私は一連の文字列が順番に消費されることを期待しています。 –

0

は、これは、任意の数n個のリスト

import random 


def get_random_sublist(n, li): 
    random.shuffle(l1) 
    start = 0 
    for k in range(n - 1, 0, -1): 
     tmp = random.randrange(start + 1, len(li) - k + 1) 
     yield li[start:tmp] 
     start = tmp 
    yield l1[start:] 


l1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 

for i in get_random_sublist(3, l1): 
    print(i) 

出力の< =長さのために動作します:

['d', 'b'] 
['c'] 
['f', 'g', 'a', 'e']