質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

294閲覧

配列の中から記号のみを取り出したい

k0908

総合スコア102

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/05/14 14:44

配列の中から 記号のみを取り出したい。

li = ["&abce!","rtcl(","ql)"]

という配列がある。この配列のそれぞれの要素の記号を取り出し、
Aメソッドに入れると、
&は@に、!は#に、(は¥に、)は%になる。
その変換された結果をまた元に戻し、文字列として出力したい。

for ch in range(len(li)): ch = A(ch) print(ch)

とすると記号以外のアルファベットもAメソッドに渡されエラーが起きる。
A(ch)のchは記号のみにしたい。
どうコードを書けばそのようにできるか?

僕は、"&abce!"や"rtcl("を

["&","a","b","c","e","!"]

["r","t","c","l","("]

とさらに細かいリストにして記号を識別しようと思ったが、記号を識別する方法がわからなかった。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんなのはいかが。

Python

1from itertools import filterfalse 2 3loop_obj = filterfalse(lambda ch: ch.isalpha(), '&abce!') 4for ch in loop_obj: 5 print(ch)

実行結果 Wandbox

plain

1& 2!

利用している機能

ひょっとしたらch.isalpha()よりch in string.ascii_lettersの方がいいかも。
速度は測ってみないとわかりませんが。

投稿2018/05/14 14:56

編集2018/05/14 14:59
LouiS0616

総合スコア35660

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

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

k0908

2018/05/14 15:00

ありがとうございます。liリストの中に日本語が入っていても(例えば、"ばり+vdx" のような)が入っていても対応できるようにしたいのですが、isalpha()のような記号かどうかを判断するメソッドはないのでしょうか?
LouiS0616

2018/05/14 15:02

日本語はだいぶ面倒です。 逆に記号は全てアスキーで表せる範囲内ですか?
k0908

2018/05/14 15:05

そうなのですね・・・。はい、記号は全てアスキーで表せます。
k0908

2018/05/14 15:06

記号を全てアスキーで表し検出する、ということはできますか?
LouiS0616

2018/05/14 15:13

文字群 !"#$%&'()*+,-./:;<=>?@[]^_`{|}~ なら、string.printable[62:94]で取得できます。 この範囲に普段もちいる記号がほとんど入っていると思いますが、どうでしょう?
k0908

2018/05/14 15:18

はい、それで取得できそうです!ありがとうございます。
hayataka2049

2018/05/14 15:20

string.punctuationが用意されているので、こっちの方が良いかもしれません(値はstring.printable[62:94]と同じです)
LouiS0616

2018/05/14 15:22

ほんとですね。ありがとうございます。
guest

0

一文字ずつin演算子で見ていけば良いのでは。こんな方針で

python

1sym_set = {"&","!","(",")"} 2 3for string in li: 4 for ch in string: 5 if ch in sym_set: 6 ch = A(ch) 7 print(ch)

投稿2018/05/14 14:48

hayataka2049

総合スコア30933

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

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

k0908

2018/05/14 14:51

ありがとうございます。sym_setに当たる部分を特定のものだけではなく全ての記号に対応させたいのですが、そのような方法はありませんか?
hayataka2049

2018/05/14 14:58

ascii文字だけならisalphaのnotとかで良いとおもいます。Unicode入ってくるとしんどい
guest

0

どんな ch でもエラーが起きないように Ax(ch) をつくればよいのでは?

Ax(ch) はこんなかたちに。

python

1def Ax(ch) 2 if ch in {"&","!","(",")"}: 3 ch = A(ch) 4 return ch

{"&","!","(",")"} の部分は A(ch) で処理出来る文字を列挙すればよいです。

A(ch) メソッド自体を変更できるなら、 A(ch) 内部で if ch in {"&","!","(",")"} を組みこんでしまったほうがよいです。

投稿2018/05/14 21:11

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問