0

を介して csv ファイルをcsv.reader()読み込んでいます。すべての種類の記号やスペースを含まない小文字の値を読みたいと思います。

a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . "

「a」を次のように変換します。

a = "kingstonusb1gb2gb32gb"

データにアルファベットと数字だけが必要です。
あらゆる種類のシンボルを削除する必要があります。これを行うために関数と関数を
使用しました。ただし、ストリップ機能は単語間のスペースを削除するだけですが、あらゆる種類の記号を削除したいのです。 ありがとう。.lower().strip()

4

3 に答える 3

3

ascii を使用している場合は、str.translate を使用して、小文字の文字列から sans digits と alpha をすべて削除できます。

>>> from string import ascii_letters, digits
>>> ascii = set(chr(e) for e in range(128))
>>> ascii_sans_alpha = ''.join(ascii.difference(ascii_letters + digits))
>>> a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . "
>>> a.lower().translate(None,ascii_sans_alpha)
'kingstonusb1gb2gb32gb'

そして、これはどのくらい速いですか?timeit 参照を使用する

>>> def mgilson(a, good = set(string.ascii_lowercase + string.digits)):
    return ''.join(x for x in a.lower() if x in good)

>>> def blender_re(a):
    return re.sub(r'[^a-z0-9]', '', a.lower())

>>> def blender_gen(a, allowed = string.lowercase + string.digits):
    return ''.join(c for c in a.lower() if c in allowed)

>>> def blender_fast(a, allowed = set(string.lowercase + string.digits)):
    return ''.join(filter(allowed.__contains__, a.lower()))

>>> def abhijit(a, ascii_sans_alpha = ''.join(set(chr(e) for e in range(128)).difference(ascii_letters + digits))):
    return a.lower().translate(None,ascii_sans_alpha)

>>> time_dict = {"abhijit": "from __main__ import string, a",
             "blender_re":"from __main__ import re, a, abhijit",
             "blender_gen": "from __main__ import string, a",
             "blender_fast": "from __main__ import string, a",
             "mgilson": "from __main__ import string, a"}
>>> for k, v in time_dict.items():
    t = timeit.Timer(stmt="{}(a)".format(k),setup = "{},{}".format(v,k))
    print "Timing for {} is {}".format(k, t.timeit(100000))


Timing for blender_fast is 0.573348026237
Timing for blender_re is 0.632169556846
Timing for blender_gen is 0.720916486331
Timing for mgilson is 0.586592185393
Timing for abhijit is 0.203489867547
>>> 
于 2013-02-28T06:02:07.703 に答える
3

正規表現を使用できます:

>>> import re
>>> a = " Kingston-(USB) = 1GB, 2GB, 32GB . . . "
>>> re.sub(r'[^a-z0-9]', '', a.lower())
'kingstonusb1gb2gb32gb'

またはジェネレーター:

>>> import string
>>> allowed = string.lowercase + string.digits
>>> ''.join(c for c in a.lower() if c in allowed)
'kingstonusb1gb2gb32gb'

または何か速い:

>>> import string
>>> allowed = set(string.lowercase + string.digits)
>>> ''.join(filter(allowed.__contains__, a.lower()))
'kingstonusb1gb2gb32gb'
于 2013-02-28T05:43:22.783 に答える
2

私はおそらく次のようなことをします:

import string
good = set(string.ascii_lowercase + string.digits)
a = ''.join(x for x in a.lower() if x in good)

おそらく最も効率的ではありませんが、機能するはずであり、読みやすく、理解しやすいものです。

于 2013-02-28T05:42:56.290 に答える