2013-02-27 17 views

cevap

40

Doğru olsun: Örneğin: Söyleyecek isterler basit generator expression ile birlikte

if any('apple' in code for code in CODES): 
    ... 

, bu görevi yapar. Jeneratör ifadesi her tuple alır ve 'apple' içeriyorsa True verir. any() daha sonra True (aksi halde False) döndürdüğü ilk öğe olduğunda True değerini döndürür. Bu, istediğiniz şeyi yapar. Ayrıca, içeriyorsa, güzel bir şekilde - okur. inşa,

cache = set(itertools.chain.from_iterable(CODES))) 

Doğal:

Eğer o zaman çok hızlı bir şekilde bunu yapmak için izin vermek için tüm değerleri bir dizi yapım değerinde olabilir, bu kez büyük bir sayı yapıyor ve performansına ihtiyacınız varsa Bu yavaş ve bellek kullanacak, bu yüzden çok fazla performansa gerek olmadığı ve çok fazla üyelik kontrolü yapamayacağınız için iyi bir fikir olmaz.

+0

Ya sadece varlığı kontrol etmek yerine - ikinci değeri almak istedim? Bu durumda "reddelicious"? –

+4

Bu durumda, yanlış veri yapısını kullanıyorsunuz, bir "dict" kullanıyorsunuz, daha sonra sadece "CODES [" apple "]' yapınız (ve orada değilse 'KeyError' değerini yakalayınız). –

+1

@ 9-bit'leri sadece 'dic = dict (CODES)' kullanın, bu bir sözlük döndürecektir.Ve daha sonra 'dic ['apple']' '' reddelicious'' ile sonuçlanacaktır. –

7

Sen itertools.chain() kullanabilirsiniz:

bunu kullanma in ile any() benzer kısa devre, sonuçlanacaktır. Benim other answer kontrol edebilirsinizperformans karşılaştırmaları için

In [30]: CODES = (
    ....:  ('apple', 'reddelicious'), 
    ....:  ('caramel', 'sweetsticky'), 
    ....:  ('banana', 'yellowfruit'), 
    ....:) 


In [31]: from itertools import chain 

In [32]: 'apple' in chain(*CODES) 
Out[32]: True 

In [33]: 'foo' in chain(*CODES) 
Out[33]: False 

.

+2

+1, Bunu yapmak için makul bir yoldur - Performansı nasıl karşılaştırdığından emin değilim. 'Chain.from_iterable() 'zincirini (*)' kullanmalısınız. –

+0

@Lattyware Ben her ikisi de() olarak düşünüyorum ve benim yöntem kısa devre yapıyor, bu nedenle, performans farkı büyük veri için ihmal edilebilir. –