2010-12-15 14 views

cevap

16

Belki

3 not in [1, 2, "a"] 
# True 
+0

Bir tuple daha iyi olmaz mıydı? – user225312

+0

@A A: OP bir öğenin listede olup olmadığını kontrol etmeyi istedi. Muhtemelen bu liste kodunda kodlanmış olmayacaktır. –

3

Not: Bir dict tuşları gibi öğeleri koyabilirsiniz Eğer üyelik için test karma algoritması çok daha hızlı sayesindedir. Sadece listeniz çok uzunsa veya uygulamanız çok fazla şey yapsa sorun olur. Aksi halde, Sven'in dediği gibi, "Y'de X değil".

any(isinstance(x, int) for x in alist) 

:

+4

Bu durumda bir set de kullanabilirsiniz. –

+2

Dikkate alınan değerler için kullanmadığınız bir takımı * kullanmanız gerekir *. – FogleBird

0

sen (Sven Marnach tarafından)

bool([x for x in alist if isinstance(x, int)]) 

daha iyi versiyonunu demek?

+0

Eğer OP'nin istediği bu gerçekten buysa, bunu alisteki x için herhangi bir (isinstance (x, int)) olarak yazmak daha iyi olurdu, çünkü bu daha özlü ve ilk int üzerinde yinelemeyi durdurur. Ama bunun ne istediğini sanmıyorum. –

+0

Haklısınız. Düzenledim;) – Ant

2

Ne yapmaya çalıştığınıza bağlı olarak değişir. Hız önemli değilse, o zaman lst içinde kullanın. Eğer önemli bir konu varsa, listenizi önce farklı bir veri yapısına (örneğin, söylenecekler listesindeki öğeleri arayacaksınız), büyüklüğüne, vb. Dönüştürmenize bağlı olup olmadığınıza bağlı olacaktır.

Bir fikir vermek için :

import timeit 

a = range(10000) 
da = dict(zip(a, [None for i in a])) 

def list_first(): 
    return 0 in a 

def dict_first(): 
    return 0 in da 

def list_last(): 
    return 9999 in a 

def dict_last(): 
    return 9999 in da 

if __name__ == "__main__": 
    for f in ["list_first", "dict_first", "list_last", "dict_last"]: 
     t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f) 
     print min(t.repeat(number=10000)) 

Bu bana verir:

Eğer beklendiği gibi, işleri hızlandırmak olmayan bir dict kullanarak, listenin başında olan bir öğe için bakarsak
0.00302004814148 
0.00318598747253 
4.21943712234 
0.004145860672 

. Sonunda bir öğe ararsanız, o zaman beklendiği gibi farklılık çok önemlidir (3 mertebeden): dict kullanımı karma, listeler her öğeyi birbiri ardına aramaya ihtiyaç duyar.

Öğeler karşılaştırılabilirse, sıranızı sıralayarak ve bir ikili arama (N yerine log (N) yerine, N (log) (N) N yerine O (1) ile karşılaştırıldığında nispeten hızlı bir şekilde büyük bir hız elde edebilirsiniz. python için uygulamada çok büyük veya daha gelişmiş yapılar (ikili arama ağacı, vb ...) kullanıyor. Oldukça karmaşık olabilir - hızlı arama için veri yapıları her şeyden önce CS'de en çok çalışılan sorunlardan biridir.

+0

Kodunuzun küme kümelerini kullanarak daha kısa bir versiyonunu burada bulabilirsiniz: https://gist.github.com/742056. Özellikle yapıcınız 'timeit.Timer' çağrısı biraz verbose görünüyor :) –

İlgili konular