1

リストに読み込んだテキスト ファイルがあります。このリストには、整数と文字列が含まれています。

たとえば、私のリストは次のようになります。

["name", "test", "1", "3", "-3", "name" ...]

.isdigit()ここで、メソッドまたはisinstance()関数を使用してすべての数値を整数に変換したいと考えています。例えば:

for i in range len(mylist):
    if mylist[i].isdigit():
        mylist[i] =  int(mylist[i])

問題は、"-3".isdigit()たとえば が返されることFalseです。問題を回避し、負の数字文字列を負の整数に変換する簡単な解決策のヒントはありますか?

4

3 に答える 3

9

メソッドは数字のみをテストし、数字で-はありません。整数を検出したい場合は、代わりにテストして例外int()をキャッチする必要があります。ValueError

for i, value in enumerate(mylist):
    try:
        mylist[i] = int(value)
    except ValueError:
        pass  # not an integer

つまり、明示的にテストする必要はありません。例外を変換してキャッチするだけです。許可を求めるのではなく、許しを求めてください。

于 2013-03-30T15:29:01.773 に答える
0

試してみて、失敗した場合は例外をキャッチします。

try:
    return int(obj)
except ValueError:
    ...

Python は、許可よりも許しを求める方が簡単であるという見方をしています。ジャンプする前に見ると、多くの場合、遅くなり、読みにくくなり、競合状態が発生する可能性があります (この場合ではなく、一般的に)。

また、Python でのインデックスによるアクセスは遅いため、リストをその場で変更することはお勧めできません。代わりに、次のようなリスト内包表記の使用を検討してください。

def intify(obj):
    try:
        return int(obj)
    except ValueError:
        return obj

mylist_with_ints = [intify(obj) for obj in mylist]

これにより、値が変更された新しいリストが作成され、より読みやすく効率的になります。

リストのすべての項目に関数を適用しているだけなので、map()ここでもうまく機能します。

mylist_with_ints = map(intify, mylist)

3.x で iterable の代わりにリストが必要な場合は、 map 呼び出しを でラップする必要があることに注意してくださいlist()

于 2013-03-30T15:29:39.073 に答える
0

整数に変換する方法は、変換を試み、失敗する準備をすることです。

for i in range(len(mylist)):
    try:
        mylist[i] = int(mylist[i])
    except ValueError:
        pass
于 2013-03-30T15:29:57.483 に答える