参照記事:
全要素が移動する(同じ位置に残らない)shuffle
あんまり他の方の記事でだらだらコメントしても失礼かなと思い、別の記事にしました。
こんなのを書きました。シャッフルしたリストを返す関数です。
import random
def shuffle_all_move( items ):
length = len( items )
res = [ 0 ] * length
rand_ord = random.sample( range( length ), k=length )
for i in range( length ) :
res[ rand_ord[ i ] ] = items[ rand_ord[ ( i + 1 ) % length ] ]
return res
これをラムダ式で書くとどうなるかな?と思いやってみました。
ところで、
##繰り返しの処理はラムダ式の中ではどうするんだろ?
いろいろ試した結果:
- やりたい処理(式に限る)をタプルにいれて、
- リスト内包表記にする。(かっこは
[ ]
に限る。( )
だとジェネレータになってしまって各要素が評価されない。)
ということでした。
import random
shuffle_all_move = ( lambda items :
( lambda
length = len( items )
, res = [ 0 ] * len( items )
, rand_ord = random.sample( range( len( items ) ), k=len( items ) )
:
(
[ ( res.pop( rand_ord[ i ] )
, res.insert(rand_ord[ i ], items[ rand_ord[ ( i + 1 ) % length ] ])
) for i in range( length )
]
, res
)[-1]
)()
)
※ 代入もできますが、無理矢理pop,insertで実現しています。実用性は?です。