« [ 政治 ] 候補者と動画で意見交換 -- 進んだ米国選挙 | トップページ | [ linux/ ubuntu ] 開発者とエンドユーザの橋渡しも提供するFeisty Fawn »

2007/04/13

[ 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

|

« [ 政治 ] 候補者と動画で意見交換 -- 進んだ米国選挙 | トップページ | [ linux/ ubuntu ] 開発者とエンドユーザの橋渡しも提供するFeisty Fawn »

コメント

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分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [ python ] 1行は無理?いやいや可能です:

» pythonでワンライナー [sh1.2 pyblosxom]
こんなんでどうでしょう。 [続きを読む]

受信: 2007/04/19 01時57分

« [ 政治 ] 候補者と動画で意見交換 -- 進んだ米国選挙 | トップページ | [ linux/ ubuntu ] 開発者とエンドユーザの橋渡しも提供するFeisty Fawn »