余分な混乱を取り除くために編集されました:これは、任意の数の入力リストで機能し、入力リストを破棄せず、それらもコピーしないソリューションです:
import random
def interleave(*args):
iters = [i for i, b in ((iter(a), a) for a in args) for _ in xrange(len(b))]
random.shuffle(iters)
return map(next, iters)
Stackoverflow ユーザーの EOL は、私のソリューションのこの拡張バージョンを親切に提供してくれました。
def interleave(*args):
iters = sum(([iter(arg)]*len(arg) for arg in args), [])
random.shuffle(iters)
return map(next, iters)
これを実行する
a = [1,2,3,4]
b = [5,6,7,8,9]
print interleave(a, b)
多くの考えられる結果の 1 つとして、次の結果が得られます。
[5, 6, 7, 1, 8, 2, 3, 9, 4]
編集: EOL の要求で、タイミング コードを更新しました。残念ながら、受け入れられたソリューションはその入力を変更するため、反復ごとに新しいコピーを作成する必要があります。結果を同等にするために、FJと私自身のソリューションの両方でこれを行いました。F.Js ソリューションのタイミングは次のとおりです。
$ python -m timeit -v -s "from srgerg import accepted" -s "a = list(xrange(40000))" -s "b = list(xrange(60000))" "accepted(list(a), list(b))"
10 loops -> 10.5 secs
raw times: 10.3 10.1 9.94
10 loops, best of 3: 994 msec per loop
私のバージョンの関数のタイミングは次のとおりです
$ python -m timeit -v -s "from srgerg import original" -s "a = list(xrange(40000))" -s "b = list(xrange(60000))" "original(list(a), list(b))"
10 loops -> 0.616 secs
raw times: 0.647 0.614 0.641
10 loops, best of 3: 61.4 msec per loop
EOL の拡張バージョンのタイミングは次のとおりです。
$ python -m timeit -v -s "from srgerg import eol_enhanced" -s "a = list(xrange(40000))" -s "b = list(xrange(60000))" "eol_enhanced(list(a), list(b))"
10 loops -> 0.572 secs
raw times: 0.576 0.572 0.588
10 loops, best of 3: 57.2 msec per loop
EOL の拡張バージョンのループからリストのコピーを削除すると、次のようになります。
$ python -m timeit -v -s "from srgerg import eol_enhanced" -s "a = list(xrange(40000))" -s "b = list(xrange(60000))" "eol_enhanced(a, b)"
10 loops -> 0.573 secs
raw times: 0.572 0.575 0.565
10 loops, best of 3: 56.5 msec per loop
別の編集: FJ には更新されたソリューションがあり、タイミングを追加するように依頼されました。
$ python -m timeit -v -s "from srgerg import fj_updated" -s "a = list(xrange(40000))" -s "b = list(xrange(60000))" "fj_updated(list(a), list(b))"
10 loops -> 0.647 secs
raw times: 0.652 0.653 0.649
10 loops, best of 3: 64.9 msec per loop