2012-09-04 25 views
8

thể trùng lặp:
Python Check if all of the following items is in a listKiểm tra nếu có nhiều đối tượng đang ở trong một danh sách bằng một "trong" tuyên bố (Python)

Vì vậy, tôi muốn kiểm tra xem cả hai văn bản và word1 là trong danh sách lst. Tất nhiên, tôi có thể viết:

if word in lst and word1 in lst: 
    do x 

Nhưng tôi tự hỏi nếu tôi có thể rút ngắn thời tuyên bố rằng một cái gì đó như:

if (word and word1) in lst: 
    do x 

Tất nhiên, điều đó không làm việc, nhưng là có bất cứ điều gì có hiệu quả tương tự mà sẽ?

Tôi đã thử như sau, nhưng như bạn thấy, nó không mang lại kết quả mong muốn.

>>> word in lst 
True 
>>> word1 in lst 
True 
>>> (word, word1) in lst 
False 

EDIT: Cảm ơn bạn đã trả lời, tôi nghĩ rằng tôi có một ý tưởng khá tốt về cách để làm điều này ngay bây giờ.

+9

Hãy thử 'set (lst) .issubset ([word, word1]) ' http://stackoverflow.com/questions/3931541/python- check-if-all-of-the-following-items-là-trong-một-danh sách –

Trả lời

9

Những câu trả lời là chính xác (ít nhất một trong số đó là). Tuy nhiên, nếu bạn đang kiểm tra ngăn chặn và không quan tâm đến trật tự, như ví dụ của bạn có thể đề xuất, câu trả lời thực sự là bạn nên sử dụng bộ và kiểm tra các tập con.

words = {"the", "set", "of", "words"} 
if words <= set_of_words: 
    do_stuff() 
7

Tạo một danh sách các từ của bạn và một biểu thức phát kiểm tra nếu họ đang có trong danh sách:

words = ["word1", "word2", "etc"] 
lst = [...] 
if all((w in lst for w in words)): 
    #do something 

all kiểm tra xem tất cả các giá trị trong một iterable là đúng sự thật. Bởi vì chúng tôi sử dụng một máy phát điện này vẫn còn ngắn mạch tối ưu hóa. Tất nhiên bạn có thể nội tuyến danh sách các từ nếu nó không phải là quá lớn cho một lớp lót:

if all((w in lst for w in ["word1", "word2", "etc"])): 
    ... 
+4

Bạn có thêm một bộ parens trong cả hai ví dụ. Genexps là các đối số duy nhất cho callables chỉ có thể được viết 'all (foo for foo in thing) '. – Julian

+1

Tôi biết, nhưng tôi thích viết chúng một cách rõ ràng bên trong dấu ngoặc đơn. Điều này làm cho nó dễ dàng hơn để xem có một iterable đó và giúp cho refactoring ... parens thêm có ích bằng cách sử dụng vim :) – l4mpi

2

Bạn có thể làm điều đó như thế:

if all(current_word in lst for current_word in (word, word1)): 
    do x 
1

Lưu ý: Không bao giờ sử dụng. Nó đơn giản ở đây để minh họa khả năng "khác" của python.

Một giải pháp kém hiệu quả:

>>> from itertools import permutations 
>>> lis=[0,1,2,3,4] 
>>> (1,2) in (z for z in permutations(lis,2)) #loop stops as soon as permutations(lis,2) yields (1,2) 
True 
>>> (1,6) in (z for z in permutations(lis,2)) 
False 
>>> (4,2) in (z for z in permutations(lis,2)) 
True 
>>> (0,5) in (z for z in permutations(lis,2)) 
False 
>>> (0,4,1) in (z for z in permutations(lis,3)) 
True 
>>> (0,4,5) in (z for z in permutations(lis,3)) 
False 
Các vấn đề liên quan