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
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.

Nasıl Python ile büyük / küçük harf du...
Ynt olmadan büyük / küçük harf duyarlı...
Dizeleri ile bir Python listesi tüm kü...
Python Büyük / Küçük Harf Duyarlı Deği...
Nasıl Java büyük / küçük harf duyarlı ...