Для списка, если он пуст в Python - PullRequest
24 голосов
/ 07 октября 2009

За последние пару дней я написал много таких конструкций:

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

Много мусора, и я присваиваю список реальной переменной (сохраняя ее в памяти дольше, чем нужно). Python упростил большую часть моего кода до настоящего времени ... Есть ли простой способ сделать это?

(Насколько я понимаю, else в конструкции for: else: всегда срабатывает после того, как он зациклен, пуст или нет - так что не то, что я хочу)

Ответы [ 7 ]

45 голосов
/ 08 октября 2009

Основываясь на других ответах, я думаю, что самые чистые решения

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

или понимание эквивалентно

result = [item*item for item in get_list() or []]
9 голосов
/ 07 октября 2009

Использовать понимание списка:

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]
5 голосов
/ 07 октября 2009

Немного более кратко:

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

при условии, что вы не меняете длину списка в цикле.

Редактировать от Оли: Чтобы компенсировать мои опасения по поводу использования памяти, он хотел бы with ing:

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

Но да, это довольно простой способ обойти эту проблему.

2 голосов
/ 07 октября 2009

Если ваши действия отличаются , я бы сделал:

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

Если ваши действия похожи , это более красиво:

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

или, если вы можете иметь None в качестве элемента списка,

for i in list_ or [...]:
   # do something for list item or built-in constant Ellipsis
2 голосов
/ 07 октября 2009
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())

Вы можете даже извлечь действия, которые нужно сделать:

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)

Редактировать от Оли: Или идти дальше:

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)
1 голос
/ 08 октября 2009

Я думаю, что в общем случае все в порядке, но вы можете рассмотреть этот подход:

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()
0 голосов
/ 17 марта 2011
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

Это помогает? Да, я знаю, что мы на два года от потребности: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...