2016-02-14 23 views
13

Tôi hoàn toàn nhận thức được điều đó ..Làm cách nào để tìm kiếm danh sách nằm trong danh sách lồng nhau (danh sách danh sách) mà không có vòng lặp trong Python?

sample=[[1,[1,0]],[1,1]] 
[1,[1,0]] in sample 

Điều này sẽ trả về True.

Nhưng những gì tôi muốn làm ở đây là điều này.

sample=[[1,[1,0]],[1,1]] 
[1,0] in sample 

Tôi muốn trở lại là True, nhưng điều này trả về False. tôi có thể làm điều này:

sample=[[1,[1,0]],[1,1]] 
for i in range(len(sample)): 
    [1,0] in sample[i] 

Nhưng tôi tự hỏi nếu có bất kỳ tốt hơn hoặc hiệu quả cách để làm việc đó.

+0

Bạn có thể sử dụng 'cho chỉ số, elem trong enumerate (mẫu): [1, 0] trong elem' qua 'phạm vi (len())' --unrelated, chỉ cần sạch – cat

Trả lời

6

bạn có thể sử dụng chuỗi từ itertools kết hợp các danh sách và sau đó tìm kiếm trong danh sách trả lại.

>>> sample=[[1,[1,0]],[1,1]] 
>>> from itertools import chain 
>>> print [1,0] in chain(*sample) 
True 
+0

Điều này sẽ không thành công nếu bất kỳ phần tử nào của danh sách ban đầu không thể lặp lại được. – schwobaseggl

+2

câu hỏi cho biết danh sách các danh sách. nếu bạn muốn tìm danh sách trong một cấu trúc tùy ý, điều này sẽ được nhập vào lãnh thổ phân tích cú pháp. nơi mô hình phù hợp hoặc du khách có lẽ sẽ áp dụng. (lưu ý rằng cả hai sẽ yêu cầu traversal của một tập hợp các cấu trúc đã biết). – Alex

1

Tôi không biết cách giải quyết điều này hoàn toàn mà không cần lặp lại. Nhưng trong Python bạn không bao giờ nên viết for i in range(len(sample)).

Vì vậy, câu trả lời cho câu hỏi của bạn: Vâng có một cách tốt hơn và nhanh hơn, bạn có thể lặp danh sách của bạn for i in sample

Cách Python xử lý các vòng là rất nhanh và cũng hoạt động rất tốt với rất nhiều entriey (hơn hơn 50.000).

1

Bạn có thể flatten danh sách sample của bạn và sau đó tìm kiếm trong danh sách mà dẹt:

> sample = [[1, [1, 0]], [1, 1]] 
> [1, 0] in [item for sublist in sample for item in sublist] 
> True 
+0

Nhưng sau đó '[1, 1] 'sẽ thất bại vì nó sẽ được làm phẳng thành' 1,1'. – Maroun

+0

@MarounMaroun có, nó sẽ không tìm thấy '1,1' nhưng" làm việc "cho vòng lặp được đưa ra trong câu hỏi sẽ không tìm thấy điều này, vì vậy tôi nghĩ rằng nó nên được theo cách này. – bastelflp

+0

Làm phẳng danh sách có thể không xử lý được tất cả các sự cố – Eric

4

Một giải pháp đệ quy có thể làm việc sâu tùy ý (tối đa đệ quy sâu sang một bên). Cũng hoạt động nếu bất kỳ phần tử nào trong danh sách ngoài cùng cũng không thể lặp lại được.

from functools import partial 

def contains_nested(some_iterable, elmnt): 
    try: 
     if elmnt in some_iterable: 
      return True 
    except TypeError: # some_iterable is not iterable 
     return False 
    else: 
     return any(map(partial(contains_nested, elmnt=elmnt), some_iterable)) 
Các vấn đề liên quan