2009-10-07 21 views
20

Tôi đã viết rất nhiều cấu trúc như thế này trong vài ngày qua:Đối với danh sách trừ khi có sản phẩm nào trong python

list = get_list() 
if list: 
    for i in list: 
     pass # do something with the list 
else: 
    pass # do something if the list was empty 

lô của rác và tôi gán danh sách để một biến thực (giữ nó trong bộ nhớ lâu hơn mức cần thiết). Python đã đơn giản hóa rất nhiều mã của tôi cho đến bây giờ ... Có cách nào dễ dàng để làm điều này không?

(sự hiểu biết của tôi là else trong for: else: xây dựng luôn luôn gây nên sau khi nó đã looped, rỗng hay không - vì vậy không phải những gì tôi muốn)

+2

Tôi không chắc chắn bất kỳ điều gì ** có thể ** dễ dàng hơn. Chuyện gì thế này? Bạn muốn loại bỏ dòng mã nào? –

+0

Vâng ...Lý tưởng nhất là tôi muốn ngừng gán danh sách cho một biến và nhỏ gọn if/else vào một phần của (Tôi biết điều đó không chắc). Tôi có thể sử dụng 'với get_list() làm danh sách:', nhưng điều đó đẩy mọi thứ ra xa hơn – Oli

+1

@Oli: Vui lòng không bình luận về câu hỏi của riêng bạn. Vui lòng * cập nhật * câu hỏi của bạn với các chi tiết bổ sung. –

Trả lời

8

Sử dụng một danh sách hiểu:

def do_something(x): 
    return x**2 

list = [] 
result = [do_something(x) for x in list if list] 
print result  # [] 

list = [1, 2, 3] 
result = [do_something(x) for x in list if list] 
print result  # [1, 4, 9] 
+9

" Nếu danh sách "ở cuối là không cần thiết và được đánh giá cho mỗi mục, không chỉ một lần. – FogleBird

+0

Điểm tốt, cảm ơn bạn đã sửa! –

+2

Sự hiểu biết của bạn không xử lý list = None –

2
def do_something_with_maybe_list(maybe_list): 
    if maybe_list: 
     for x in list: 
      do_something(x) 
    else: 
     do_something_else() 

do_something_with_maybe_list(get_list()) 

Bạn thậm chí có thể trích xuất các hành động được thực hiện:

def do_something_with_maybe_list(maybe_list, process_item, none_action): 
    if maybe_list: 
     for x in list: 
      process_item(x) 
    else: 
     none_action() 

do_something_with_maybe_list(get_list(), do_something, do_something_else) 
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other) 

chỉnh sửa từ Oli: Hoặc đi một nữa:

def do_something_with_maybe_list(maybe_list, process_item, none_action): 
    if maybe_list: 
     return process_list(maybe_list) 
    return none_action() 

do_something_with_maybe_list(get_list(), do_something, do_something_else) 
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other) 
+0

Có thể bạn thực sự muốn ML. :) –

+0

Đã thêm một lớp giảm khác. Việc xử lý có thể (và có thể aught) được thực hiện bên ngoài. Và tôi sẽ cần phải quay trở lại để tôi có thể cắt bỏ 'else', kiểu bảo vệ – Oli

4

Hơi khó hiểu hơn là:

for i in my_list: 
    # got a list 
if not my_list: 
    # not a list 

giả sử bạn không thay đổi độ dài của danh sách trong vòng lặp.

Chỉnh sửa từ Oli: Để bù đắp những lo lắng của tôi sử dụng bộ nhớ, nó muốn with ing:

with get_list() as my_list: 
    for i in my_list: 
     # got a list 
    if not my_list: 
     # not a list 

Nhưng vâng, đó là khá một cách đơn giản xung quanh vấn đề này.

2

Nếu hành động của bạn là khác nhau, tôi sẽ làm:

list_ = get_list() # underscore to keep built-in list 
if not list_: 
    # do something 
for i in list_: # 
    # do something for each item 

Nếu hành động của bạn là tương tự, đây là đẹp hơn:

for i in list_ or [None]: 
    # do something for list item or None 

hoặc, nếu bạn có thể có None là một yếu tố danh sách,

for i in list_ or [...]: 
    # do something for list item or built-in constant Ellipsis 
27

Dựa trên câu trả lời khác, tôi nghĩ rằng giải pháp sạch nhất là

#Handles None return from get_list 
for item in get_list() or []: 
    pass #do something 

hoặc hiểu equiv

result = [item*item for item in get_list() or []] 
1

Tôi nghĩ rằng cách của bạn là ok trong trường hợp chung, nhưng bạn có thể xem xét cách tiếp cận này:

def do_something(item): 
    pass # do something with the list 

def action_when_empty(): 
    pass # do something if the list was empty 

# and here goes your example 
yourlist = get_list() or [] 
another_list = [do_something(x) for x in yourlist] or action_when_empty() 
-1
i = None 
for i in get_list(): 
    pass # do something with the list 
else: 
    if i is None: 
     pass # do something if the list was empty 

Điều đó có hữu ích không? Có, tôi biết chúng tôi cần hai năm để tránh :-)

+1

Điều này sẽ không hoạt động nếu phần tử cuối cùng trong get_list() thực sự là 'None'. – Danosaure

Các vấn đề liên quan