Comment detail

文字列の均等分割 (Nested Flatten)
例えば3分割なら1, 2, 3, 1, 2, 3, ... という配列を作ってソートし、1が並んでいるインデックスを1列目、
2が並んでいるインデックスを2列目・・・という風に文字列をスライスしています。
1
2
3
4
5
divid <- function(num, sample){
   string <- unlist(strsplit(sample, ""))
   breaks <- sort(rep(1:num, len=length(string)))
   cat(sapply(1:num, function(n)(paste(string[breaks==n], collapse=""))), sep="\n")
}

なるほど。その発想を使ってみました。 cycleは与えられたリストを巡回し続ける無限リストで、zipは短い方に会わせて切り詰めます。

これでも算術演算やstrlenは必要ないですね…正規表現を使うよりは黒魔術っぽさがなくていいかも。

>>> cycle(range(3))
<itertools.cycle object at 0x0270AAA8>
>>> zip(_, "hoge")
[(0, 'h'), (1, 'o'), (2, 'g'), (0, 'e')]
1
2
3
4
5
def divid(n, s):
    from itertools import cycle
    xs = zip(cycle(range(n)), s)
    return ["".join(c for i, c in xs if i == j)
             for j in range(n)]
Pythonの便利さがすごい・・・。
自分のコードは文字の長さを使っていたので、strlen相当の関数を使用しないように変更してみました。

ifelseは第1引数の条件がTRUEなら第2引数、FALSEなら第3引数の処理を実行します。
条件にはTRUE/FALSEのリストを渡すこともでき、その長さに応じて後ろの処理のリストはコピーされていきます。
1
2
-   breaks <- sort(rep(1:num, len=length(string)))
+   breaks <- sort(ifelse(string==string, 1:num))

Index

Feed

Other

Link

Pathtraq

loading...