Pythonのリストで何かを見つけたい場合は、「in」演算子を使用できます。
list = ['foo', 'bar']
'foo' in list #returns True
しかし、ネストされたリストで何かを見つけたい場合はどうすればよいですか?
list = [('foo', 'bar'), ('bar', 'foo')]
'foo' in list #returns False
たとえば、forループなしで1行でそれを行うことは可能ですか?
ありがとう!
Pythonのリストで何かを見つけたい場合は、「in」演算子を使用できます。
list = ['foo', 'bar']
'foo' in list #returns True
しかし、ネストされたリストで何かを見つけたい場合はどうすればよいですか?
list = [('foo', 'bar'), ('bar', 'foo')]
'foo' in list #returns False
たとえば、forループなしで1行でそれを行うことは可能ですか?
ありがとう!
あなたはおそらく欲しいですany
:
>>> list = [('foo', 'bar'), ('bar', 'foo')]
>>> any('foo' in e for e in list)
True
ただし、ある種のループは避けられません。
あなたはそのようなitertools.chainを使うことができます:
from itertools import chain
nested__seq = [(1,2,3), (4,5,6)]
print 4 in chain(*nested__seq)
PS:「リスト」のようなブルティンをオーバーライドするべきではありません
虐待的ですが、これは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
あなたもこれを行うことができます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
任意の深さの反復可能オブジェクトのリストがある場合は、最初にそれを平坦化します。
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