SORU
20 EYLÜL 2009, Pazar


Python: dize rakam dışında karakter çıkarma

Nasıl dize rakamlar dışındaki tüm karakterleri kaldırabilir miyim?

CEVAP
20 EYLÜL 2009, Pazar


2.* Python bugüne kadar en hızlı yaklaşım .translate yöntemi:

>>> x='aaa12333bb445bb54b5b52'
>>> import string
>>> all=string.maketrans('','')
>>> nodigs=all.translate(all, string.digits)
>>> x.translate(all, nodigs)
'1233344554552'
>>> 

string.maketrans bu durumda ''.join(chr(x) for x in range(256)) aynı çeviri tablosu (uzunluğu 256 bir karakter dizisi) (sadece daha hızlı yapmak için;-). .translate çeviri tablosu burada all aslında kimlik anlamına geldiğinden alakasız olan) geçerlidir VE ikinci bağımsız değişken anahtar kısmını karakterler mevcut siler.

.translate çok farklı Unicode dizeleri (ve 3 -- Python ben . dize çalışır ^strong>yapınPython sürüm önemli olan keşke soruları belirtilen faiz!) -- bu kadar basit değil, oldukça hızlı, oldukça kullanışlı olsa da, hala değil.

Geri 2.*, performans farkı etkileyici.:

$ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)'
1000000 loops, best of 3: 1.04 usec per loop
$ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 7.9 usec per loop

Şeyler 7-8 kere hızlandırmak pek fıstık, translate yöntemi bilerek ve kullanarak değer. Diğer popüler olmayan YNT yaklaşım...:

$ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())'
100000 loops, best of 3: 11.5 usec per loop

RE P daha yavaştır, .translate yaklaşım bu büyüklükte bir düzen içinde atıyor.

Python 3 veya Unicode için, silmek istediğiniz şey için None döndürür .translate bir eşleme (sıra sayıları, karakterleri doğrudan, anahtar gibi değil) geçmesi gerekir. Burada "her şey" birkaç karakter: . silme işlemi için bu ifade için uygun bir yol

import string

class Del:
  def __init__(self, keep=string.digits):
    self.comp = dict((ord(c),c) for c in keep)
  def __getitem__(self, k):
    return self.comp.get(k)

DD = Del()

x='aaa12333bb445bb54b5b52'
x.translate(DD)

ayrıca '1233344554552' yayar. Ancak, bu koymak zorundayız xx.py ...:

$ python3.1 -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 8.43 usec per loop
$ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
10000 loops, best of 3: 24.3 usec per loop

...performans avantajı gösteren kaybolur, "silme" görevleri ve performansının düşmesine neden olur. bu tür

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007
  • Phandroid

    Phandroid

    26 Ocak 2009