2013-02-24 33 views
5

Nếu tôi muốn tìm một cái gì đó trong một danh sách trong python Tôi có thể sử dụng 'trong' điều hành:Alternative cho 'trong' điều hành cho các danh sách lồng nhau

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

Nhưng những gì tôi nên làm gì nếu tôi muốn tìm một cái gì đó trong danh sách lồng nhau?

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

Có thể thực hiện điều đó trong một hàng không có vòng lặp không?

Cảm ơn!

+1

Thực ra đó là một bộ dữ liệu lồng nhau, nhưng không quan trọng. –

Trả lời

8

Bạn có thể muốn any:

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

Một số loại vòng lặp là không thể tránh khỏi mặc dù.

+0

Ah hoàn hảo, cảm ơn bạn :) Tôi không biết rằng tôi có thể kết nối các statemens + nhà khai thác trong một dòng. Cảm ơn! – Eknoes

1

Bạn cũng có thể làm điều này với in

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

EDIT: kiểm tra phương pháp này chỉ khi foo là yếu tố như nắm tay.

Để tìm kiếm như 'foo' một yếu tố (bất kỳ):

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

Một số thử hơn:

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

Điều này không làm những gì bạn nghĩ. '[x [1] cho x trong danh sách]' chỉ tìm kiếm phần tử thứ hai của mỗi tuple nội bộ, tức là '['bar', 'foo']'. – chmullig

+0

@chmullig Có bạn là chính xác. Bây giờ cập nhật câu trả lời của tôi Cảm ơn! –

1

Nếu bạn có một danh sách các iterables với độ sâu tùy ý, làm phẳng nó đầu tiên:

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) 

In:

True 
True 
False 
1

Bạn có thể sử dụng itertools.chain như thế:

from itertools import chain 

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

print 4 in chain(*nested__seq) 

PS: bạn không nên ghi đè bultins như "danh sách"

2

Đó là lạm dụng, nhưng bạn có thể làm điều này trong một dòng khá dễ dàng.

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

Và đây là phương pháp của bạn Tốt! –