SORU
2 EKİM 2010, CUMARTESİ


eğer listedeki tüm öğeleri aynı olup olmadığını kontrol

Aşağıdaki işlevi ihtiyacım var:

Giriş: *2.*

Çıktı:

  • Giriş listedeki tüm elemanları birbirine eşit standart eşitlik operatörü kullanarak değerlendirmek True;
  • False aksi.

Performans: elbette, gereksiz yükünü almak istemiyorum.

İçin iyi olacağını hissediyorum:

  • liste boyunca yineleme
  • bitişik öğeleri karşılaştırmak
  • ve AND Boolean değerleri elde edilen tüm

Ama en Pythonic yol yapmak ne olduğundan emin değilim.


EDİT:

Tüm büyük cevaplar için teşekkür ederim. Birkaç dekor ve @KennyTM arasında seçim yapmak gerçekten zordu ve @Ivo van Wijk çözümler der.

Kısa devre özelliği eksikliği sadece erken eşitsiz elemanları uzun bir giriş (~50 elemanlar üzerinde) acıyor. Eğer bu (ne sıklıkla listeleri olabilir nasıl bağlıdır) yeterince sık olursa, kısa devre gereklidir. Kısa devre en iyi algoritma checkEqual1 KennyTM @gibi görünüyor. Ancak, bunun için ciddi bir bedel öder:

  • performans 20x " e kadar hemen hemen aynı listeler
  • x kısa listelerinde performans 2.5

Eğer erken eşitsiz elemanları ile uzun girişi olmaz ise ya da yeterince nadiren olur), kısa devre gerekli değil. O zaman, bugüne kadar en hızlı @Ivo van der Wijk çözümdür.

CEVAP
2 EKİM 2010, CUMARTESİ


Daha hızlı bir çözüm kümesini kullanarak daha() dizileri üzerinde çalışır (iterables değil) sadece ilk öğe saymak. Bu listede boş olmayan (ama kontrol için önemsiz ve sonuç boş bir liste üzerinde ne olması gerektiğine kendiniz karar verin) olduğunu varsayar

x.count(x[0]) == len(x)

bazı basit kriterler:

>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*5000', number=10000)
1.4383411407470703
>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*4999 [2]', number=10000)
1.4765670299530029
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*5000', number=10000)
0.26274609565734863
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*4999 [2]', number=10000)
0.25654196739196777

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • pissengehen

    pissengehen

    26 EYLÜL 2006