2013-02-24 22 views
5

Wenn ich etwas in einer Liste in Python finde ich die ‚in‘ Operator verwenden:Alternative für ‚in‘ Operator für verschachtelte Listen

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

Aber was soll ich tun, wenn ich etwas finden will in einer verschachtelten Liste?

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

Ist es möglich, es in einer Zeile ohne eine for-Schleife zum Beispiel zu tun?

Danke!

+1

Eigentlich ist das ein verschachteltes Tupel, aber das spielt keine Rolle. –

Antwort

8

Sie wollen wahrscheinlich any:

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

Irgendeine Art von Schleife obwohl unvermeidlich ist.

+0

Ah perfekt, danke :) Ich wusste nicht, dass ich diese Statements + Operatoren in einer Zeile verbinden kann. Vielen Dank! – Eknoes

1

Sie könnten auch dies mit in

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

EDIT: diese Methode Prüfung nur dann, wenn foo ist als Faust Element.

als 'foo' ein Element suchen (jeder):

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

Einige weitere Versuch:

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

Dies tut nicht, was Sie denken, dass es tut. '[x [1] für x in Liste]' sucht nur das zweite Element jedes internen Tupels, dh '['bar', 'foo']' '. – chmullig

+0

@chmullig Ja, Sie haben Recht. Jetzt aktualisiert meine Antwort Danke! –

1

Wenn Sie eine Liste von Iterables mit beliebiger Tiefe haben, glätten Sie es zuerst:

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) 

Drucke:

True 
True 
False 
1

könnten Sie itertools.chain so verwenden:

from itertools import chain 

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

print 4 in chain(*nested__seq) 

PS: Sie sollten nicht bultins wie „Liste“ außer Kraft setzen

2

Es ist beleidigend, aber man kann diese ziemlich leicht in einer Zeile zu tun.

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

Und das ist Ihre Methode gut! –