2012-09-04 13 views
8

संभव डुप्लिकेट:
Python Check if all of the following items is in a listपरीक्षण करता है, तो एक से अधिक ऑब्जेक्ट बयान (अजगर) "में" एक का उपयोग कर एक सूची में हैं

इसलिए मैं दोनों शब्द है कि क्या परीक्षण करना चाहते हैं और में word1 हैं सूची एलएसटी। बेशक, मैं लिख सकते हैं:

if word in lst and word1 in lst: 
    do x 

लेकिन अगर मैं की तरह कुछ करने के लिए कि बयान छोटा सकता है मैंने सोचा:

if (word and word1) in lst: 
    do x 
बेशक

, वह काम नहीं करता है, लेकिन वहाँ कुछ भी प्रभावी ढंग से कि इसी तरह की है मर्जी?

मैंने निम्नलिखित की कोशिश की, लेकिन जैसा कि आप देख सकते हैं, यह वांछित परिणाम नहीं देता है।

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

संपादित करें: जवाब के लिए धन्यवाद, मुझे लगता है कि मैं कैसे अब यह करने के लिए की एक बहुत अच्छा विचार है।

+9

'प्रयास करें सेट (lst) .issubset ([शब्द, word1])' http://stackoverflow.com/questions/3931541/python- चेक-इन-ऑल-ऑफ-द-इन-आइटम-इन-इन-ए-लिस्ट –

उत्तर

9

उत्तर सही हैं (कम से कम एक उनमें से है)। हालांकि, अगर आप रोकथाम जांच कर रहे हैं और आदेश की परवाह नहीं करते हैं, जैसे आपका उदाहरण सुझाव दे सकता है, असली जवाब यह है कि आपको सेट का उपयोग करना चाहिए, और सबसेट की जांच करनी चाहिए।

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

अपने शब्दों की एक सूची है और एक जनरेटर अभिव्यक्ति की जाँच अगर वे सूची में हैं:

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

all जांच करता है कि एक iterable में सभी मान सही हैं। चूंकि हम जनरेटर का उपयोग करते हैं, यह अभी भी शॉर्ट-सर्किट अनुकूलित है। बेशक आप शब्दों की सूची इनलाइन सकता है अगर यह एक-लाइनर के लिए बहुत बड़ा नहीं है:

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

आपके पास दोनों उदाहरणों में माता-पिता का एक अतिरिक्त सेट है। जेनेक्सप्स जो कॉलबेल के लिए एकमात्र तर्क हैं, उन्हें 'सब कुछ (चीज में फू के लिए फू' लिखा जा सकता है। – Julian

+1

मुझे पता है, लेकिन मैं उन्हें स्पष्ट रूप से ब्रांड्स के अंदर लिखना पसंद करता हूं। इससे यह देखना आसान हो जाता है कि वहाँ एक पुनरावर्तनीय है और refactoring के लिए मदद करता है ... अतिरिक्त parens vim का उपयोग कर काम में आते हैं :) – l4mpi

2

आपको लगता है कि जैसे कि यह कर सकता है:

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

नोट: कभी भी इस प्रयोग न करें। पाइथन की "अभी तक एक और" क्षमता को चित्रित करने के लिए यह बस यहां है।

एक कम कुशल समाधान:

>>> 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 
संबंधित मुद्दे

 संबंधित मुद्दे