SORU
15 EYLÜL 2008, PAZARTESİ


Python dizeleri büyük / küçük harf Yoksay

Python dizeleri, davayı görmezden karşılaştırmak için en kolay yolu nedir?

(Str1.yapabilir elbette() alt <= str2.(düşük), vb., ama bu iki ek geçici dizeleri (açık ayırma/g-c genel giderleri ile) yarattı.

C stricmp bir karşılığını arıyorum sanırım().

[Biraz daha bağlam istenen, basit bir örnekle gösterilmektedir:] ederim

Dizeler çok uzun bir liste sıralamak istediğinizi varsayalım. Sadece theList.() tür. Bu O(n * log(n)) dize karşılaştırmaları ve bellek yönetimi (tüm beri. elemanları akıllı işaretçiler bir tür vardır dizeleri ve liste). Mutlu.

Şimdi de aynısını yapmak istiyorum, ama durum (hadi basitleştirmek ve yok sayalım tüm dizeler yerel sorunlar göz ardı edilebilir yani ascıı). TheList yapabilirsiniz.sort(key=lambda s: s.(düşük), ama sonra iki yeni neden karşılaştırma başına ayırmaları, artı yinelenen ile çöp toplayıcısını yükünü (indirdi) dizeleri. Her bir bellek yönetimi gürültü basit dize karşılaştırma daha büyüklük açısından daha yavaştır.

Şimdi, bir ile yerinde () stricmp gibi işlev: theList.sort(cmp=stricmp) ve hafıza dostu olarak theList kadar hızlı ve.() tür. Tekrar mutlu olursunuz.

Sorun Python tabanlı büyük / küçük harf duyarlı karşılaştırma içerir örtülü herhangi bir dize. C tabanlı karşılaştırmalar bulmak için bekliyordum, (belki modülü dize) mükerrer.

Böyle bir şey bulamadı, bu yüzden asıl soru burada. (Bu soruya açıklık umuyoruz).

CEVAP
23 EYLÜL 2008, Salı


Burada str.lower kullanarak daha hızlı kabul cevabı önerdiği yöntem daha olduğunu gösteren bir kriter (libc.strcasecmp):

#/usr/bin/env python2.5
import random
import timeit

from ctypes import *
libc = CDLL("libc.dylib") # change to "libc.so.6" on linux

words = [word.rstrip() for word in
          open('/usr/share/dict/words', 'r').readlines()]
random.shuffle(words)
print '%i words in list' % len(words)

setup = 'from __main__ import words, libc; gc.enable()'
stmts = [
    ("simple sort", "sorted(words)"),
    ("sort with key=str.lower", "sorted(words, key=str.lower)"),
    ("sort with cmp=libc.strcasecmp", "sorted(words, cmp=libc.strcasecmp)"),
]

for (comment, stmt) in stmts:
    t = timeit.Timer(stmt=stmt, setup=setup)
    print "%s: %.2f msec/pass" % (comment, (1000*t.timeit(10)/10))

benim makinede tipik kat:

235886 words in list
simple sort: 483.59 msec/pass
sort with key=str.lower: 1064.70 msec/pass
sort with cmp=libc.strcasecmp: 5487.86 msec/pass

Yani, str.lower ile sürümü değil, sadece çok hızlı, ama aynı zamanda önerilen tüm çözümler burada en taşınabilir ve pythonic. Bellek kullanımı profilli değil, ama Gönderen yine de bunu dert etmek için ikna edici bir sebep verdi. Ayrıca, kütüphanenin modüle bir ara herhangi bir şart yinelenen olmadığını kim söyledi?

NB: lower() string yöntemi, yerele bağımlı olma avantajına sahiptir. Muhtemelen Kendin yazdığın zaman hemen elde edilecek bir şey değil "" çözüm. optimize edilmiş Öyle olsa bile, böcek ve Python eksik özellikleri nedeniyle, karşılaştırma bu tür bir unicode bağlamında yanlış sonuçlar verebilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cdgotx

    cdgotx

    8 Kasım 2011
  • cyriak

    cyriak

    29 Mart 2006
  • Rooster Teeth

    Rooster Teet

    11 Temmuz 2006