4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

4
6
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?