28

文字列形式の数字と文字を含むリストがあります。

mylist=['1','orange','2','3','4','apple']

数字のみを含む新しいリストを作成する必要があります。

mynewlist=['1','2','3','4']

リスト内の各項目を整数に変換できるかどうかを確認する方法があれば、次のようにして、必要なものを思いつくことができるはずです。

for item in mylist:
    if (check item can be converted to integer):
        mynewlist.append(item)

文字列を整数に変換できることを確認するにはどうすればよいですか? または、それを行うより良い方法はありますか?

4

4 に答える 4

46

これを試して:

mynewlist = [s for s in mylist if s.isdigit()]

ドキュメントから:

str.isdigit()

文字列内のすべての文字が数字で、少なくとも 1 文字ある場合は true を返し、そうでない場合は false を返します。

8 ビット文字列の場合、このメソッドはロケールに依存します。


コメントに記載されているように、isdigit()返されることは、関数Trueを介して文字列を int として解析できることを必ずしも示すとは限りません。それにもかかわらず、上記のアプローチはあなたの場合にうまくいくはずです。int()False

于 2013-06-04T00:58:00.717 に答える
14

高速でシンプルですが、常に正しいとは限りません。

>>> [x for x in mylist if x.isdigit()]
['1', '2', '3', '4']

数値を取得する必要がある場合は、より伝統的です。

new_list = []
for value in mylist:
    try:
        new_list.append(int(value))
    except ValueError:
        continue

: 結果には整数が含まれます。必要に応じて文字列に変換し、上記の行を次のように置き換えます。

try:
    new_list.append(str(int(value)))
于 2013-06-04T00:58:54.170 に答える
10

str.digit整数に対してのみ機能し、次のようなものでも失敗する可能性があるため、例外処理を使用できます。

>>> str.isdigit(' 1')
False

ジェネレーター関数の使用:

def solve(lis):                                        
    for x in lis:
        try:
            yield float(x)
        except ValueError:    
            pass

>>> mylist = ['1','orange','2','3','4','apple', '1.5', '2.6']
>>> list(solve(mylist))                                    
[1.0, 2.0, 3.0, 4.0, 1.5, 2.6]   #returns converted values

または、これが欲しかったかもしれません:

def solve(lis):
    for x in lis:
        try:
            float(x)
            return True
        except:
            return False
...         
>>> mylist = ['1','orange','2','3','4','apple', '1.5', '2.6']
>>> [x for x in mylist if solve(x)]
['1', '2', '3', '4', '1.5', '2.6']

またはを使用するast.literal_evalと、これはすべてのタイプの数値で機能します。

>>> from ast import literal_eval
>>> def solve(lis):
    for x in lis:
        try:
            literal_eval(x)
            return True
        except ValueError:   
             return False
...         
>>> mylist=['1','orange','2','3','4','apple', '1.5', '2.6', '1+0j']
>>> [x for x in mylist if solve(x)]                               
['1', '2', '3', '4', '1.5', '2.6', '1+0j']
于 2013-06-04T01:00:12.160 に答える
6

何かを に変換できるかどうかを確認する通常の方法intは、 EAFPの原則tryに従って、それを確認することです。

try:
    int_value = int(string_value)
except ValueError:
    # it wasn't an int, do something appropriate
else:
    # it was an int, do something appropriate

だから、あなたの場合:

for item in mylist:
    try:
        int_value = int(item)
    except ValueError:
        pass
    else:
        mynewlist.append(item) # or append(int_value) if you want numbers

ほとんどの場合、で終わる簡単なコードのループはmynewlist.append(item)、リスト内包表記、ジェネレーター式、または or の呼び出しに変換できmapますfiltertryしかし、式に/を入れる方法がないため、ここではできませんexcept

しかし、関数でラップすると、次のことができます。

def raises(func, *args, **kw):
    try:
        func(*args, **kw)
    except:
        return True
    else:
        return False

mynewlist = [item for item in mylist if not raises(int, item)]

...または、必要に応じて:

mynewlist = filter(partial(raises, int), item)

次のように使用する方がクリーンです。

def raises(exception_types, func, *args, **kw):
    try:
        func(*args, **kw)
    except exception_types:
        return True
    else:
        return False

このようにして、期待している例外 (または例外のタプル) を渡すことができ、それらは を返しますがTrue予期しない例外が発生した場合、それらは伝播します。そう:

mynewlist = [item for item in mylist if not raises(ValueError, int, item)]

…あなたが望むことをしますが、:

mynewlist = [item for item in mylist if not raises(ValueError, item, int)]

… は当然のように aTypeErrorを発生させます。

于 2013-06-04T02:35:30.403 に答える