Python
ラムダ式

Python : lambdaの中でも繰り返しできた

More than 1 year has passed since last update.

参照記事:
全要素が移動する(同じ位置に残らない)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で実現しています。実用性は?です。