Perlで言う、join関数が使い難い。

| | コメント(7) | トラックバック(0)

Perlでは、連結文字が「.」で、数値の乗算加算には「+」を用いるのに対し
Pythonでは、両方に「+」を用いることになる。
これにより、数値を連結しようとすると
必然的に、二つの数値の和になってしまう訳だ。

>>> a = 1
>>> b = 2
>>> a + b
3
>>> # "ab"にはならない

これを回避するには、str()を使う。

>>> str(a)
"1"

str()は、数値も文字列にも使用でき
どちらに対しても、文字列という型に変換することができる。

例えば、以下の例でエラーメッセージに出くわす人も
多いのではないだろうか(筆者もその一人)

>>> a = ["abc", "def"]

この配列を連結させたい場合、Perlなら
# join("", @a)だけでOK。
Pythonの場合は「'連結文字'.join(配列)」の形。

>>> ''.join(a)
"abcdef"

となる。
が、aの配列の値が数値で構成されている場合。
もしくは配列の値に数値の型が含まれている場合。

>>> a = [1, 2, 3, 4]
>>> ''.join(a)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: sequence item 0: expected string, int found

となる。
要約すれば「文字列があるべきところに数値があるよ」ってこと。
数値をjoinメソッドに渡す事はできない。
ならば、数値を文字列に変換するstr()を使用する。

>>> ''.join(str(a))
"[1, 2, 3, 4]"

これでは駄目だ。
配列の要素、一つ一つにstr()を行わなければならない。

Pythonには、内包表記というものがある。
リストやタプルの中で、式やfor文を用い
結果をリストやタプルの型で返すというもの。
これを利用し、次のようにする。

>>> ''.join([str(t) for t in a])
"1234"

これが正規のやり方なのかは不明だが
とりあえず、安全にかつ高速に使えるみたいだ。
誰か、より良いやり方、関数があったら教えてください。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Perlで言う、join関数が使い難い。

このブログ記事に対するトラックバックURL: http://mt.blog-slime.com/mt-tb.cgi/9

コメント(7)

''.join(map(str,a))

とか。
(大差ないですね。)

コメントありがとうございます。
ちょっと綺麗になりますね~。

perl使ってると、型の意識が低いんですよね。
慣れると、抵抗なくなりました。

Pythonでの高速な文字列結合は、基本的にstr.joinを使用するか、フォーマット指定を使用するかのどちらかですが、上記の問題の場合、最後の''.join([str(t) for t in a])が一番正当です。

全く正当ではないですが、フォーマット指定を利用するこういうやり方もできます。
>>> a = ["a", 2, 3, 'b']
>>> ('%r'*len(a) % tuple(a)).replace("'", "")
'a23b'

'%r' % objはrepr(obj)の値を表示するので数値型でも文字列型でも構いません。但し、文字列はシングルクォーテーションが付いてしまうのが難点です。そのため最後にreplace()してシングルクォーテーションを取り除いています。

すみません。

>>> a = ['a', 2, 3, "b"]
>>> '%s'*len(a) % tuple(a)
'a23b'

で、OKだったみたいです。

>>> '%s %s' % (2, 2.0)
'2 2.0'

のように、%sに数値型オブジェクトを渡せるみたいですね。これだったら結構すっきりした書き方と言えるかもしれません。正当ではないと思いますが、応用性はあると思います。文字列の掛け算はショートコードでは良く使うテクニックだと思います。

通りすがりですが
乗算→加算
積→和
では?

わ。ほんとですね、超大ボケです。。。
よっぽど何かをかけたい気分だったみたいですw
失礼しました。

>>morchinさん

親切なコメントありがとうございます。

pythonに移行して、結構経ちますが
perl等では実装されていない、python独自の文法については
そんな応用の仕方があったんだと感動してしまいます。

tupleが本当に必要な場面というのも始めて見ました。。

ある意味perlより見づらいソースも可能ですよねw

コメントする

このブログ記事について

このページは、adminが2007年7月28日 12:14に書いたブログ記事です。

ひとつ前のブログ記事は「BeautifulSoupでHTML解析」です。

次のブログ記事は「内部エンコーディングに使われるエンコードをUTF-8に設定する方法。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。