2012-09-04 9 views
8

Olası Çoğalt:
Python Check if all of the following items is in a listTest birden fazla nesne beyanı (Python) "bölümünde" birini kullanarak bir listede olup olmadığını

yüzden gerek sözleri olup olmadığını test etmek istiyorum ve de kelime1 Var lst. Tabii , ben yazabilirsiniz:

if word in lst and word1 in lst: 
    do x 

Ama böyle bir şey için bu ifadeyi kısaltabilir miyim: çalışmıyor Tabii

if (word and word1) in lst: 
    do x 

, ama hiçbir şey etkili bir şekilde benzer olduğu irade?

Aşağıdakileri denedim, ancak gördüğünüz gibi istenen sonucu vermiyor.

>>> word in lst 
True 
>>> word1 in lst 
True 
>>> (word, word1) in lst 
False 

DÜZENLEME

: Ben şimdi bunu nasıl oldukça iyi bir fikrim var, cevaplar için teşekkür ederiz. bir iterable tüm değerler doğruysa

words = ["word1", "word2", "etc"] 
lst = [...] 
if all((w in lst for w in words)): 
    #do something 

all kontroller:

+9

'set (l'inci) .issubset ([kelime, kelime-1])' deneyin http://stackoverflow.com/questions/3931541/python- Aşağıdaki listede yer alan tüm öğeler için check-if-all-of-the-a- –

cevap

9

cevaplar doğru (en az bir o tek astar için çok büyük değilse Tabii ki kelime listesini satır içine alabilirsiniz onların). Ancak, kontrol kontrolleri yapıyorsanız ve siparişinizle ilgilenmiyorsanız, örneğinizin önerebileceği gibi, gerçek cevap set kullanmanız ve altkümeleri kontrol etmenizdir.

words = {"the", "set", "of", "words"} 
if words <= set_of_words: 
    do_stuff() 
7

kelimelerin bir listesini ve listedeki ise kontrol jeneratör ifade oluşturur. Bir jeneratörü kullandığımız için bu hala kısa devre optimize edilmiştir.

if all((w in lst for w in ["word1", "word2", "etc"])): 
    ... 
+4

Her iki örnekte de ekstra bir dizi paren var. Genel ifadelerin tek argümanı olan genex'ler sadece “hepsi (foo for thing)” yazılabilir. – Julian

+1

Biliyorum, ancak bunları açık bir şekilde parantez içinde yazmayı tercih ediyorum. Bu, orada yinelenebilir bir orada görmek ve refactoring için yardımcı olur ... ekstra parens vim kullanarak kullanışlı gelmesini sağlar :) – l4mpi

2

Böyle yapabileceğini:

if all(current_word in lst for current_word in (word, word1)): 
    do x 
1

Not: Bunu hiç kullanmayın. Python'un “bir başka” kabiliyetini göstermek için burada sadece.

daha az etkili bir çözüm:

>>> from itertools import permutations 
>>> lis=[0,1,2,3,4] 
>>> (1,2) in (z for z in permutations(lis,2)) #loop stops as soon as permutations(lis,2) yields (1,2) 
True 
>>> (1,6) in (z for z in permutations(lis,2)) 
False 
>>> (4,2) in (z for z in permutations(lis,2)) 
True 
>>> (0,5) in (z for z in permutations(lis,2)) 
False 
>>> (0,4,1) in (z for z in permutations(lis,3)) 
True 
>>> (0,4,5) in (z for z in permutations(lis,3)) 
False 
İlgili konular