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

''.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