2012-06-25 32 views
6

xem xét chức năng đơn giản nàypython làm thế nào để kiểm tra danh sách does't chứa bất kỳ giá trị

def foo(l=[]): 
    if not l: print "List is empty" 
    else : print "List is not empty" 

Bây giờ chúng ta hãy gọi foo

x=[] 
foo(x) 
#List is empty 

foo('') 
#List is empty 

Nhưng nếu x = [ ''] danh sách không được coi là trống!!!

x=[''] 
foo(x) 
#List is not empty 

Câu hỏi -

  1. Tại sao danh sách các giá trị rỗng không được coi là sản phẩm nào? (Trong trường hợp biến nó được coi như ví dụ trống)

    x='' 
    if x:print 'not empty!!' 
    else: print 'empty' 
    
  2. Làm thế nào tôi có thể sửa đổi chức năng foo() để danh sách đó sẽ được coi là có sản phẩm nào trong tất cả các trường hợp: x=[], x=[''], x=['', '']

+0

Lưu ý- Tôi hiểu trong trường hợp x = [ ''] danh sách thực sự là không trống nhưng vẫn còn nó bạn biết nó có sản phẩm nào :) (hoặc nó không có giá trị/dữ liệu có thể được sử dụng) –

+4

Bạn đang thực sự ** cố gắng làm gì? Tại sao bạn ** muốn ** '['', '']' được coi là "trống"? –

+0

['', ''] không phải là vấn đề lớn .... cho tập hợp này (['', '']) có thể được sử dụng !! –

Trả lời

13

Sử dụng được xây dựng trong any()

def foo(l=[]): 
    if any(l): 
     print 'List is not empty' 
    else: 
     print 'List is empty' 

foo(['']) 
# List is empty 
+2

Lưu ý rằng điều này sẽ "thất bại" đối với '[['']]'. Tuy nhiên, tôi không chắc chắn rằng những gì OP đang làm là khôn ngoan anyway. Quan trọng hơn, điều này không thành công cho '[false]'. – Eric

+0

Đúng trên cả hai đếm có Eric. –

2

trong ví dụ của bạn, trường hợp duy nhất mà danh sách thực sự là trống là một trong đó không có gì trong dấu ngoặc vuông. Trong các ví dụ khác, bạn có danh sách với số lượng chuỗi rỗng khác nhau. Đây chỉ đơn giản là khác nhau (và trong tất cả các ngôn ngữ tôi có thể nghĩ đến, điều tương tự cũng đúng).

0

Danh sách [''] thực sự không trống. Nó chứa một chuỗi rỗng. Chuỗi trống, danh sách là không phải là. Nếu bạn muốn tìm các danh sách này, hãy kiểm tra xem danh sách có trống không và nếu không, hãy kiểm tra xem mọi mục nhập có phải là '' hay không.

1

Trước hết: Ngay cả chuỗi trống cũng là một chuỗi. Một danh sách chứa một chuỗi rỗng vẫn chứa một phần tử.

trong khi a='' trống với len = 0, danh sách này vẫn không có, ví dụ: mylist = [a] giống như mylist = [''] nhưng có thể rõ ràng hơn cho bạn. Hãy a làm phần tử và bỏ qua nội dung.

Để kiểm tra xem các thành phần của danh sách có trống hay không, hãy lặp lại chúng.

def isEmpty(li=[]): 
    for elem in li: 
    if len(elem) > 0: return false 
    return true 
+0

Tôi nghĩ rằng bạn có logic sai. Nếu bạn quay trở lại trên 'len> 0', thì không có điểm nào lặp lại trên' l' sau đó. – glglgl

+0

@gigigi: bạn hoàn toàn đúng, tôi đã sửa nó. Nhưng bất kỳ cũng sẽ làm việc. – tuergeist

1

Bạn có thể sử dụng gọi đệ quy đến hàm foo để xử lý danh sách lồng nhau.

def foo(l=[]): 
    if type(l)==list: 
     return any([foo(x) for x in l]) 
    else: 
     return bool(l) 
1

Để trả lời câu hỏi đầu tiên của bạn về việc tại sao một danh sách các giá trị rỗng không được xem là trống rỗng, đó là bởi vì nó có chứa một cái gì đó, ngay cả khi những điều bản thân họ có sản phẩm nào. Hãy nghĩ về nó như một cái hộp rỗng.

Đoạn mã dưới đây cho thấy một cách để sửa đổi chức năng foo() để thực hiện những gì bạn muốn (và kiểm tra nó). Ý niệm của bạn về những gì một danh sách trống là đáng ngạc nhiên khó khăn để đưa ra, một phần vì nó chạy ngược với những gì ngôn ngữ chính nó xem xét trống rỗng.Như bạn có thể thấy tất cả các logic đối phó với việc xác định xem danh sách là "trống" theo định nghĩa của bạn đã được chuyển vào một chức năng riêng biệt gọi là empty_list() vì điều đó có thể có ít để làm với phần còn lại của những gì foo() phải hoàn thành. Nó không quá phức tạp và nếu không có gì khác nên cung cấp cho bạn một điểm khởi đầu tốt.

Ngoài ra, bạn không nói nên làm gì nếu đối số được truyền không phải là danh sách bất kỳ loại nào hoặc là danh sách nhưng không chỉ chứa các danh sách hoặc chuỗi khác, vì vậy, nó sẽ tăng TypeError ngoại lệ - một cái gì đó tương tự như cách hầu hết các hàm Python tích hợp trả lời khi điều này xảy ra với chúng. Dưới đây là các mẫu mã và đầu ra thử nghiệm của nó:

try: 
    string_type = basestring 
except NameError: # probably Python 3.x 
    string_type = str 

class _NULL(object): # unique marker object 
    def __repr__(self): return '<nothing>' 
_NULL = _NULL() 

def empty_list(arg=_NULL): 
    arg = arg if arg is not _NULL else [] 
    if not isinstance(arg, (list, string_type)): 
     raise TypeError 
    elif isinstance(arg, string_type): 
     return not len(arg) 
    else: 
     return len(arg) == 0 or all(empty_list(e) for e in arg) 

def foo(list_=None): 
    if list_ is None or empty_list(list_): 
     print 'list is empty' 
    else: 
     print 'list is not empty' 

testcases = [ 
    _NULL, 
    [], 
    [''], 
    ['', ''], 
    ['', ['']], 
    ['abc'], 
    ['', 'abc'], 
    [False], 
    [None], 
    [0], 
    [0.0], 
    [0L], 
    [0j], 
    [42], 
    [{}], 
    [{'':0}], 
    [{'a':1}], 
    False, 
    None, 
    0, 
    0.0, 
    0L, 
    0j, 
    42, 
    {}, 
    {'':0}, 
    {'a':1}, 
] 

for arg in testcases: 
    call = 'foo({!r:s}) ->'.format(arg) 
    print '{!s:>20s}'.format(call), 
    try: 
     foo() if arg is _NULL else foo(arg) 
    except TypeError: 
     print 'illegal argument exception' 

Dưới đây là đầu ra nó tạo ra với Python 2.7:

foo(<nothing>) -> list is empty 
     foo([]) -> list is empty 
     foo(['']) -> list is empty 
    foo(['', '']) -> list is empty 
foo(['', ['']]) -> list is empty 
    foo(['abc']) -> list is not empty 
foo(['', 'abc']) -> list is not empty 
    foo([False]) -> illegal argument exception 
    foo([None]) -> illegal argument exception 
     foo([0]) -> illegal argument exception 
    foo([0.0]) -> illegal argument exception 
     foo([0L]) -> illegal argument exception 
     foo([0j]) -> illegal argument exception 
     foo([42]) -> illegal argument exception 
     foo([{}]) -> illegal argument exception 
foo([{'': 0}]) -> illegal argument exception 
foo([{'a': 1}]) -> illegal argument exception 
    foo(False) -> illegal argument exception 
     foo(None) -> list is empty 
     foo(0) -> illegal argument exception 
     foo(0.0) -> illegal argument exception 
     foo(0L) -> illegal argument exception 
     foo(0j) -> illegal argument exception 
     foo(42) -> illegal argument exception 
     foo({}) -> illegal argument exception 
    foo({'': 0}) -> illegal argument exception 
    foo({'a': 1}) -> illegal argument exception 
Các vấn đề liên quan