へたれプログラマな日々 このページをアンテナに追加 RSSフィード

2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 09 | 12 |
2011 | 01 | 02 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 |
2014 | 12 |

2008-06-30 コレはホントに感動した。

すげーコード見つけた

色々とTracのソースを眺めてたらすごいコードを発見したので、忘れないようにメモ

ココの 60行目から引用

60	DIGITS = re.compile(r'(\d+)')
61	def embedded_numbers(s):
62	    """Comparison function for natural order sorting based on
63	    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/214202."""
64	    pieces = DIGITS.split(s)
65	    pieces[1::2] = map(int, pieces[1::2])
66	    return pieces

すごいところが分かりやすいようにして軽く実行してみるとこんな感じ

>>> import re
>>> DIGITS = re.compile(r'(\d+)')
>>> pieces = DIGITS.split('123a4bcd56e')
>>> map(int, pieces[1::2])
[123, 4, 56]
>>> pieces = DIGITS.split('abc123a4bcd56')
>>> map(int, pieces[1::2])
[123, 4, 56]

こんな簡単な書き方で文字列から数値だけを抜き出してる。

この処理が秀逸だよなぁ。必ず偶数番目に数値がくるっていうのが目からウロコ

>>> print DIGITS.split('abc123a4bcd56')
['abc', '123', 'a', '4', 'bcd', '56', '']
>>> print DIGITS.split('123a4bcd56e')
['', '123', 'a', '4', 'bcd', '56', 'e']

Pythonは奥が深い

2008/07/09 追記

http://d.hatena.ne.jp/odz/20080708/1215470530 より

SEP = re.compile(r'[^\d]+')
def embedded_numbers1(s):
    return [int(x) for x in SEP.split(s) if x]

DIGITS = re.compile(r'\d+')
def embedded_numbers2(s):
    return [int(x) for x in DIGITS.findall(s)] 

こんな書き方もできるみたい。っていうか普通に書いたら当然こうなるわな。人の書いたコードを読むのはホント勉強になる。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証