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

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

ただいまの
回答率

90.49%

  • Python

    8516questions

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

python 文字列を判定する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 561

bullton

score 23

何らかのstr型が連続して格納されている配列(例['100'],['.'],['abc'])の各要素を判定し、数値ならint型に変換後次要素の判定に移る、数値ではないのであればfalseを出力するプログラムを作りたいです。

数値判定の方法とfor文、if文の組み合わせに戸惑っています。
回答をお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

結果を配列で返すならこんな感じでしょうか?配列にしか使えなくなりますけど。

def is_int_in_array(arr):
    result = []
    for i in arr:
        try:
            result.append(int(i))
        except ValueError:
            result.append(False)
    return result

if __name__=='__main__':
    array = ['100','.','abc']
    print(is_int_in_array(array)) # [100, False, False]

追記

Falseで返せとのことでしたから返してますけど、配列で返すならresult.append(False)を取り除き、そこをpassにすることで数値だけの配列にできます。

○ついでにジェネレータにしてみました(^_^)

def is_int_in_array(arr):
    for i in arr:
        try:
            yield int(i)
        except ValueError:
            yield False

if __name__=='__main__':
    array = ['100','.','abc']
    print(*(is_int_in_array(array))) # 100 False False

追記2

一つでも変換できなければFalseを返すようにするならばこうですかね?
ジェネレータにはできませんでしたが、、

あともしかして文字列を配列とみなすという意味だったとか?その場合でも下記プログラムでいけるはずです。

def is_int_in_array(arr):
    result = []
    for i in arr:
        try:
            result.append(int(i))
        except ValueError:
            return False
    return result

if __name__=='__main__':
    array1 = ['100','.','abc']
    print(is_int_in_array(array1)) # False

    array2 = ['100','200','300']
    print(is_int_in_array(array2)) # [100, 200, 300]

    string1 = '100.abc'
    print(is_int_in_array(string1)) # False

    string2 = '100200300'
    print(is_int_in_array(string2)) # [1, 0, 0, 2, 0, 0, 3, 0, 0]

追記3

○追記2について補足
後々になって考えてみれば文字列ならint(文字列)でエラーが出るか見るだけでいいんですよね…まぁ配列がメインだったということで。

○返信に対して

指定というのがどういう意味かによりますけど、条件分岐させるということならそのようなif節を加えるだけで良いかと。

def is_int_in_array(arr):
    result = []
    for i in arr:
        try:
            n = int(i)
            if 0<=n and n<=100:
                result.append(n)
            '''
            else:
                return False
            '''
        except ValueError:
            return False
    return result

if __name__=='__main__':
    array1 = ['100','.','abc']
    print(is_int_in_array(array1)) # False

    array2 = ['0','50','100','200','300']
    print(is_int_in_array(array2)) # [0, 50, 100]


収まらなければ弾く(resultに加えない)だけならそのままで、収まらない場合が一つでもあればFalseを返すようにするなら途中のコメントアウト(''')を取って下さい。m(_ _)m

追記が長くなってしまいすみません、、

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 16:02

    ついでにジェネレータにした方がPythonらしいかもしれないですね。

    キャンセル

  • 2017/09/15 16:16

    確かにそうですね。ありがとうございます。

    追記に書いてみましたがこんな感じでしょうか?多少間違っているかも…

    キャンセル

  • 2017/09/15 16:31

    いい感じだと思います。

    キャンセル

  • 2017/09/15 16:37

    ご回答ありがとうございます。
    falseに関しては、int型に変換できない要素が一つでも存在した場合はその時点でforから抜け出すという意図で記載しました。的確でない文章で申し訳ございません。

    str型である入力配列の要素の内、数値のみをint型に変換し、出力はint型の配列としたいです。
    入力配列の中に、一つでも数値ではない要素が含まれているのであれば、その時点で出力はfalseと判断するプログラムを目指しております。

    キャンセル

  • 2017/09/15 16:48

    追記しました。よろしくお願いします。m(_ _)m

    キャンセル

  • 2017/09/15 18:16

    ありがとうございます。
    ここで質問なのですが、配列resultに要素を追加していく際に、同時にそのint型の値が0から100の値に収まるかなどを指定することは可能でしょうか?

    キャンセル

  • 2017/09/15 19:19

    また追記しました。よろしくお願いします。m(_ _)m

    キャンセル

  • 2017/09/15 20:00

    何度も追記をいただき感謝しております。
    お陰様で解決に至りました。
    ありがとうございました。

    キャンセル

0

リストを順にintにキャストし、不可能な場合Falseを返す関数

def is_int(arg):
    try:
        int(arg)
        return True
    except:
        return False

def main():
    my_str = ['100', '.', 'abc']
    for elem in my_str:
        if is_int(elem):
            print(int(elem))
        else:
            print(False)

if __name__ == '__main__':
    main()

"""実行結果
100
False
False
"""

リストの要素がすべてintにキャスト出来るか確かめる方法

def main():
    my_str1 = ['100', '.', 'abc']
    my_str2 = ['421', '657', '1000']

    try:
        print(list(map(int, my_str1)))
    except:
        print('cannot cast')

    try:
        print(list(map(int, my_str2)))
    except:
        print('cannot cast')

if __name__ == '__main__':
    main()

"""実行結果
cannot cast
[421, 657, 1000]
"""

int型のリストから、特定の範囲の値だけ抜き出す関数

def make_func_in_range(arg_range):
    def ret_func(num):
        return arg_range[0] <= num <= arg_range[1]
    return ret_func

def filter_in_range(arg_list, arg_range: tuple):
    in_range = make_func_in_range(arg_range)
    return filter(in_range, arg_list)

def main():
    int_list = [421, 657, 1000]
    print(list(filter_in_range(int_list, (500, 800))))

if __name__ == '__main__':
    main()

"""出力
[657]
"""

せっかく回答をいただいているんですから、まずそちらにお礼言いましょうよ。
https://teratail.com/questions/92558

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 16:42

    ご回答ありがとうございます。
    私の知識不足で回答いただいたコードの理解に達せずコメント内容を考えられておりません。

    キャンセル

  • 2017/09/15 18:01

    目的語が不明ですが...
    ・私に対して、という意味だったら
    → どこまでわかってどこからわからないのか伝えていただけないとどうしようもないです。
    ・前の質問に対して、という意味だったら
    → とりあえずお礼をいいましょう。そして、質問の曖昧な部分を編集して正し、目的が明確に伝わるようにしましょう。

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    TwitterOAthでのエラー

    TwitterOAthでエラーが出ました。 調べても分からないので教えて下さい。 エラーは以下の通りです。 Parse error: syntax error, unexpect

  • 解決済

    bootstrap collapse

    bootstrap のアコーディオンcollapseのイベントをクリックイベントじゃなくて、ホバーでオン、オフを切り替える方法を…

  • 解決済

    クリックでclassを追加したい

    特定要素をクリックすることで別要素にclassを追加したいです。 具体的なソースは以下の通りです。   <ul class="category-nav"> <li class=

  • 解決済

    cakeの検索機能についての質問です。

    データを検索すると次のページに遷移させたときに検索条件が引き継げなかったため、postではなくgetで送ることでデータを引き継いだ検索ができるようになりました。 しかし、chec

  • 解決済

    Javascript jQuery 複数のフォームの数字を計算

    前提・実現したいこと Javascriptで複数のフォームの中の数値を足し算したいと思っています 該当のソースコード $(function(){ $('#hoge

  • 受付中

    cakephpのFormで「div」にクラスを追加したい

    cakephpの$this->Form->inputで「div」にクラス「spnWid100」を追加したいのですが 「div="spnWid100"」となってしまいます。 よろしく

  • 解決済

    CodeIgniter3での文字化けについて

    いつもお世話になっております。 以下の手順を実施しますと、a1の内容が文字化けします。 a1の結果を表示する際も文字化けをなくしたいのですが、 ご存知の方がいらっしゃれば、

  • 解決済

    cakephpでワードプレスみたいに、 今見てる記事と同じ子カテゴリーの記事を表示させる方法

    cakephp2.xもうすぐ3.0にします 親カテゴリー、子カテゴリーを作りました。 以下のような感じで、 アソシエーションでカテゴリーを別けて、 コントローラー publ

同じタグがついた質問を見る

  • Python

    8516questions

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