2013-02-24 49 views
5
için 'in' operatörü

Ben 'in' operatörü kullanabilirsiniz Python listede şey bulmak isterseniz:Alternatif iç içe listeleri

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

Ama bir şeyler bulmak istiyorsanız ne yapmalıyım iç içe geçmiş bir listede?

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

Örneğin bir döngü olmadan bir satırda yapmak mümkün mü?

Teşekkürler!

+1

Aslında bu yuvalanmış bir tuple'dır, ama önemli değil. –

cevap

8

Muhtemelen any istiyorum: döngü çeşit olsa kaçınılmazdır

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

.

+0

Ah mükemmel, teşekkür ederim :) Bu statemens + operatörlerini tek bir satırda bağlayabildiğimi bilmiyordum. Teşekkürler! – Eknoes

1

Ayrıca in

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

EDIT'e ile yapabilirsiniz: foo olarak yumruk eleman yalnızca bu yöntem çek.

'foo' bir eleman (herhangi bir) olarak aramak için:

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

Bazı deneme daha: Eğer keyfi derinliğe sahip Iterables bir listesi varsa

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

Bu, düşündüğün şeyi yapmaz. [x [1] x in listesindeki] 'sadece her dahili tuple'ın ikinci elemanını arar, yani' ['bar', 'foo'] '. – chmullig

+0

@chmullig Evet, haklısınız. Şimdi cevabımı güncelledi Teşekkürler! –

1

, önce onu düzleştirmek:

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) 

Baskılar:

True 
True 
False 
1

Böyle itertools.chain kullanabilirsiniz:

from itertools import chain 

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

print 4 in chain(*nested__seq) 

PS: Eğer "liste"

2

Bu kötü niyetli gibi bultins geçersiz olmamalı, ancak oldukça kolay bir satırda yapabilirsiniz.

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

Ve bu sizin yönteminiz İyi! –