🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4894閲覧

Python3.xでstr.maketransとstr.translateを使いたいがどうしてもエラーが出る

ichi_

総合スコア15

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/17 15:32

編集2019/09/17 16:44

当方,画像処理とか色々とやっています.
二値化画像aを読み込んでラベリングし,オブジェクトを見つけるようにしています.

例えば1番にラベル付けられている画像をobjとして読み込み,1番にラベル付けられている領域をobjとして取り出します.

a = sp.label(a)
obj = sp.find_objects(a[0])[1]

追記箇所
そうすると,この場合ですと
(slice(317L, 392L, None), slice(544L, 692L, None))
という出力が得られます
左が画像の縦方向の座標の上下端,右が画像の横方向の座標の左右端に相当します.
追記箇所終わり

追記及び修正箇所
この出力から文字等を消して数値のみ取り出したいのですが,Python2.7では

obj = str(obj).translate(None, "slice")
obj = str(obj).translate(None, "(")
obj = str(obj).translate(None, ")")
obj = str(obj).translate(None, "L")
obj = str(obj).translate(None, "[")
obj = str(obj).translate(None, "]")
obj = str(obj).translate(None, ",")
obj = str(obj).translate(None, "None")
obj = obj.split()
という処理をし,
[317, 392, 544, 692]
という出力を得ていました.
しかし,最近Python3.6に更新したらエラーを吐きました.
追記及び修正箇所終わり

エラーは
TypeError: translate() takes exactly one argument (2 given)

色々調べてみると,str.maketransとstr.translateを組み合わせればよいみたいなのですが,

table = str.maketrans({'slice': None, '(': None, ')': None, 'L': None, '[': None, ']': None, ',': None, 'None': None})
obj = str(obj).translate(table)

としたら,

ValueError: string keys in translate table must be of length 1

となりました.

どうすればいいでしょうか.

更に追記
正規表現を使えばいい,という回答もいただきましたが,
今度は
TypeError: expected string or bytes-like object
というエラーが出ます...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

obj = str(obj).translate(None, "slice")

そのコードは、文中から s, l, i, c, e を順序問わず排除しますが問題無いですか?

Python2

1>>> 'slice'.translate(None, 'slice') 2'' 3>>> 'slslslslslsl'.translate(None, 'slice') 4''

大元の2.7のコードがそもそも間違っているように思えてならないのです。

ValueError: string keys in translate table must be of length 1

置換元が一文字一文字独立であることがはっきりする仕様ですね。

Python3

1>>> str.maketrans({'s': '', 'l': '', 'i': '', 'c': '', 'e': ''}) 2{115: '', 108: '', 105: '', 99: '', 101: ''} 3>>> 4>>> str.maketrans({'slice': ''}) 5Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7ValueError: string keys in translate table must be of length 1

本題

文中から次の語句や文字を排除したいのでしょうか。
sliceNone()[],L

それならば、正規表現を使った方が手っ取り早いです。

Python

1>>> import re 2>>> 3>>> src = 'slice spam [1, 2, 3] (4, 5, 6)' 4>>> re.sub(r'slice|None|[()[],L]', '', src) 5' spam 1 2 3 4 5 6'

あるいはもっと簡単な解決法があるようにも思います。
しかし、こればかりはなぜそのような処理を要しているのか分からないと何とも言えません。

追記:
sp.find_objectsがscipy.ndimage.measurements.find_objectsを指しているなら、
各数値を得るのに文字列表現を経由する必要は無さそうです。

Python

1obj = sp.find_objects(a[0])[1] 2dst = [ 3 obj[0].start, obj[0].stop, obj[1].start, obj[1].stop 4] 5 6print(*dst)

これで充分。
文字列を成形して必要な値を拾うのは、最終手段だと思った方が良いです。

投稿2019/09/17 15:58

編集2019/09/17 22:59
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ichi_

2019/09/17 16:02

これ,出力が[slice(34L, 53L, None), slice(), ...]って出てくるんですよね...
ichi_

2019/09/17 16:06

教えていただいたように入力してみましたが,今度は TypeError: expected string or bytes-like object というエラーが出ました...
LouiS0616

2019/09/17 21:56

re.subの引数は全て文字列です。
LouiS0616

2019/09/17 23:00 編集

修正: 当初コメントに書いた内容を、回答に追記しました。
ichi_

2019/09/18 15:27

解決しました.文字列だから消せば良いだけと思っていました...ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問