2017-05-30 14 views
5

Giả sử chúng tôi đang kiểm tra xem có bất kỳ số lẻ nào trong số list hay không. Cách trực tiếp nhất là:Cách kiểm tra xem có bất kỳ số lẻ/số chẵn nào trong Iterable (ví dụ: danh sách/bộ) không?

def has_odd(L): 
    for v in L: 
     if v % 2 == 1: 
      return True 
    return False 

các has_odd kiểm tra chức năng nếu có bất kỳ số lẻ trong một list, từng là một số lẻ được tìm thấy, nó sẽ trả True. Nhưng điều này có vẻ hơi dài dòng. Một cách ngắn gọn hơn bằng reduce là như sau:

reduce(lambda res, v: res or bool(v), L, False) 

Nhưng điều này sẽ lặp qua tất cả các yếu tố và là không cần thiết, bởi vì một khi một số lẻ được tìm thấy kết quả là chắc chắn True.

Vì vậy, có cách nào khác để thực hiện việc này không?

+4

'bất kỳ (int (chữ số)% 2 cho chữ số trong str (số)) ' –

+0

Rõ ràng nếu' L' là một chuỗi, hình thức đúng là' bất kỳ (số% 2 cho số trong trình tự) '. Tôi bằng cách nào đó hiểu sai một câu hỏi và nghĩ rằng bạn đang kiểm tra chữ số bằng số, cho số trong danh sách. –

Trả lời

6

Bạn có thể sử dụng any() chức năng để giảm rườm rà:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> any(n % 2 == 1 for n in l) 
True 
>>> 

Lưu ý tuy nhiên, any() is pretty much the same as you had originally just generalized, vì vậy tôi không mong đợi một sự cải thiện tốc độ:

def any(iterable): 
    for element in iterable: 
     if element: 
      return True 
    return False 
+2

Đó _could_ được cô đặc thành 'bất kỳ (n% 2 cho n trong l)', hoặc 'bất kỳ (n & 1 cho n trong l)', nhưng tôi đoán phiên bản của bạn có thể đọc được một chút. –

+0

@ PM2Ring Có, quyền của bạn. Tôi biết tôi có thể giảm nó xuống nhiều hơn. Nhưng, như bạn đã nói, tôi nghĩ rằng phiên bản tôi đăng là một chút dễ đọc hơn. Và nó không thực sự có nhiều chi phí. –

+0

Tôi có một câu hỏi nhỏ: trong biểu thức 'bất kỳ (n% 2 == 1 cho n trong l)', là 'n% 2 == 1 cho n trong l' một' máy phát điện'? Không phải nó là 'bất kỳ ((n% 2 == 1 cho n trong l)) '? –

1

trước hết chúng ta hãy viết chỉ nhỏ chức năng cho "kỳ quặc" như

def is_odd(number): 
    return number % 2 

thì chúng ta có thể ITE chỉ số của chúng tôi cho "có ít nhất một số lẻ" sử dụng any với imap/map

  • Python 2. *

    from itertools import imap 
    
    
    def has_odd_number(iterable): 
        return any(imap(is_odd, iterable)) 
    
  • Python 3. *

    def has_odd_number(iterable): 
        return any(map(is_odd, iterable)) 
    

hoặc với generator expression

def has_odd_number(iterable): 
    return any(is_odd(number) for number in iterable) 

Ví dụ:

>>> has_odd_number([0]) 
False 
>>> has_odd_number([1]) 
True 
0

Một cách khác. bạn có thể sử dụng not all()

>>> l = [2, 4, 5, 6, 7, 8, 9, 10] 
>>> not all(n%2==1 for n in l) 
True 
Các vấn đề liên quan