2013-02-24 31 views
5
के लिए ऑपरेटर 'में'

मैं अजगर में एक सूची में कुछ मैं ऑपरेटर 'में' उपयोग कर सकते हैं करना चाहते हैं:वैकल्पिक नेस्टेड सूचियों

list = ['foo', 'bar'] 
'foo' in list #returns True 

लेकिन मुझे क्या करना चाहिए, अगर मैंने कुछ पता लगाना चाहते हैं एक घोंसला सूची में?

list = [('foo', 'bar'), ('bar', 'foo')] 
'foo' in list #returns False 

उदाहरण के लिए लूप के बिना इसे एक पंक्ति में करना संभव है?

धन्यवाद!

+1

वास्तव में यह एक घोंसला वाला ट्यूपल है, लेकिन इससे कोई फर्क नहीं पड़ता। –

उत्तर

8

आप शायद any हैं:

>>> list = [('foo', 'bar'), ('bar', 'foo')] 
>>> any('foo' in e for e in list) 
True 

पाश किसी प्रकार हालांकि अनिवार्य है।

+0

आह सही, धन्यवाद :) मुझे नहीं पता था कि मैं इन राज्यों + ऑपरेटरों को एक पंक्ति में जोड़ सकता हूं। धन्यवाद! – Eknoes

1

तुम भी साथ in

>>> list = [('foo', 'bar'), ('bar', 'foo')] 
>>> 'foo' in (x[1] for x in list) 
True 

संपादित ऐसा कर सकता है: इस विधि की जांच केवल तभी foo के रूप में मुट्ठी तत्व है।

'foo' एक तत्व (किसी भी) के रूप में खोजने के लिए:

>>>'foo' in reduce(lambda x,y: x+y, list) 
True 

कुछ और कोशिश:

In [7]: list 
Out[7]: [('foo', 'me', 'bar'), ('bar', 'foo', 'you')] 
In [8]: 'me' in reduce(lambda x,y: x+y, list) 
Out[8]: True 

In [9]: 'you' in reduce(lambda x,y: x+y, list) 
Out[9]: True 
+0

यह ऐसा नहीं करता जो आपको लगता है कि यह करता है। '[x [1] x सूची में x]' केवल प्रत्येक आंतरिक ट्यूपल के दूसरे तत्व की खोज करता है, यानी '[' bar ',' foo '] '। – chmullig

+0

@chmullig हाँ आप सही हैं। अब मेरा जवाब अपडेट किया गया धन्यवाद! –

1

आप मनमाने ढंग से गहराई के साथ iterables की एक सूची है, तो पहले उसे समतल:

import collections 

li= [('foo', 'bar'), ('bar', 'foo'),[[('deeper',('foobar'))]]] 

def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, basestring): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

print 'deeper' in flatten(li) 
print 'foo' in flatten(li) 
print 'nope' in flatten(li) 

प्रिंटों:

True 
True 
False 
1

आप उस तरह itertools.chain इस्तेमाल कर सकते हैं:

from itertools import chain 

nested__seq = [(1,2,3), (4,5,6)] 

print 4 in chain(*nested__seq) 

पुनश्च: आप "सूची"

2

यह अपमानजनक है जैसे bultins पर हावी नहीं होना चाहिए, लेकिन आप बहुत आसानी से एक पंक्ति में कर सकते हैं।

mainlist = [('foo', 'bar'), ('bar', 'foo')] 
[elem for elem in sublist for sublist in mainlist] #['bar', 'bar', 'foo', 'foo'] 

'foo' in [elem for elem in sublist for sublist in mainlist] # True 
+0

और यह आपकी विधि अच्छी है! –