[ python ] 1行は無理?いやいや可能です
ある人から「これ↓って Python じゃできないよね。改行とインデント必須だし」といわれたので、Ruby のコードを Python で書いてみた。
p [4,2,3,6,1].sort_by{|x| if x % 2 == 0 then x else -x end}
↑奇数を降順に、次に偶数を昇順に並べるソート
# => [3, 1, 2, 4, 6]
Python だって1 行で書けるさ (・∀・)b
すさまじく邪悪になったけど・・・orz
globals().__setitem__( "odd_and_even", map( (lambda residue: [integer for integer in unsorted_list if not cmp( (integer % 2), residue )]), [1, 0] ) ) or [odd_and_even[ flag ].sort( reverse = not( flag ) ) for flag in (0, 1)] and reduce( (lambda odd_list, even_list: odd_list + even_list), odd_and_even )
得られる結果は↓のコードを実行したときと同じ。
import random
unsorted_list = [random.randrange( 1, 10 ) for iteration in range( 10 )]
odd_list = [integer for integer in unsorted_list if (integer % 2) == 1]
even_list = [integer for integer in unsorted_list if (integer % 2) == 0]
odd_list.sort( reverse=True )
even_list.sort()
sorted_list = odd_list + even_list
print sorted_list
| 固定リンク
この記事へのコメントは終了しました。
コメント
sorted( unsorted_list, cmp = lambda x,y: cmp(x if x%2==0 else -x, y if y%2==0 else -y))
投稿: aaa | 2007/04/22 13時59分
組み込み関数 sorted() をつかって
一発でソートできるとは思いつきませんでした。
こんなに短くなるんですね。
投稿: Fomalhaut | 2007/04/22 15時30分