6

Pythonのリストで何かを見つけたい場合は、「in」演算子を使用できます。

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

しかし、ネストされたリストで何かを見つけたい場合はどうすればよいですか?

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

たとえば、forループなしで1行でそれを行うことは可能ですか?

ありがとう!

4

5 に答える 5

8

あなたはおそらく欲しいですany

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

ただし、ある種のループは避けられません。

于 2013-02-24T22:23:26.653 に答える
2

あなたはそのようなitertools.chainを使うことができます:

from itertools import chain

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

print 4 in chain(*nested__seq)

PS:「リスト」のようなブルティンをオーバーライドするべきではありません

于 2013-02-24T22:57:47.923 に答える
2

虐待的ですが、これは1行で非常に簡単に行うことができます。

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
于 2013-02-25T01:46:18.403 に答える
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
于 2013-02-24T22:31:09.617 に答える
1

任意の深さの反復可能オブジェクトのリストがある場合は、最初にそれを平坦化します。

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
于 2013-02-24T22:38:50.633 に答える