0

CSVをARFFに変換するコードを書こうとしています。それぞれの間の値を","配列のセルにインポートします。たとえば、次のようなインスタンスです。

Monday,176,49,203,27,77,38,Second

に変換されます:

['Monday', '176', '49', '203', '27', '77', '38', 'Second']

問題は、Python が各セルを文字列として認識し、例として Python によって認識された型を確認できることです。

[<type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>]

公称属性と数値属性を区別する方法を探していますか?

4

3 に答える 3

3

私が考えることができる最高のものは、ast.literal_evalを使用して、次のようなものです:

import ast

def converter(x):
    try:
        val = ast.literal_eval(x)
        return val
    except ValueError:
        return x

を与える

>>> seq = ['Monday', '176', '49', '203', '27', '77', '38', 'Second']
>>> newseq = [converter(x) for x in seq]
>>> newseq
['Monday', 176, 49, 203, 27, 77, 38, 'Second']
>>> map(type, newseq)
[<type 'str'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'str'>]

を使用する利点は、ast.literal_evalより多くのケースを適切に処理できることです。

>>> seq = ['Monday', '12.3', '(1, 2.3)', '[2,"fred"]']
>>> newseq = [converter(x) for x in seq]
>>> newseq
['Monday', 12.3, (1, 2.3), [2, 'fred']]
于 2013-01-06T06:04:15.453 に答える
2
for i in lst:
    try:
        int(i)
        #whatever you want to do
    except ValueError:
        #error handling

これは機能しますが、これからの方がはるかに優れています。

for i in lst:
    if i[-1].isdigit():  #it is a number
        #whatever
    else:
        #whatever else

ここから撮影

参照: str.isdigit() メソッド

于 2013-01-06T05:45:57.323 に答える
1

ここでパフォーマンスが非常に重要な場合は、3段階のアプローチを採用しようと思います。このアプローチでは、最初の文字の単純なチェックを使用して、intまたはに文字列をキャストしてから失敗することを不必要に回避します。float

  • チャンクごとに、最初の文字が数字かどうかを確認します
  • そうである場合は、最初にそれをとして解析してみてください。int失敗した場合は、次のように解析してください。float
  • それがすべて失敗した場合、あなたは大きな問題を抱えています:)

何かのようなもの:

for chunk in chunks:
    if chunk[0].isdigit():
        try:
            return int(chunk)
        except ValueError:
            return float(chunk)
    else:
        # It's a string (a non-numeric entity)
        return chunk

もちろん、text/csvファイルでhex/octリテラルをサポートするには、もう少し特別な処理が必要ですが、それは通常のケースではないと思いますか?

編集:考えてみると、Volatilityは同様のアプローチを使用していますが、唯一の違いはisdigit、最初の文字だけでなく文字列全体を呼び出すことです。すべての文字で呼び出される長い数値シーケンスがある場合、これには少し時間がかかる可能性がありますがisdigit、私のアプローチでは常に最初の文字をチェックするため、少し速くなる可能性があります。

于 2013-01-06T05:59:27.597 に答える