Как проверить, нет ли вложенного списка в списке пустым? [Дубликат]

Скорее попробуйте что-то вроде

public override string ToString()
{
    return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary);
}

Но это не входит в класс

, поэтому

class Employee
{
    private string _name;
    private string _number;
    private int _date;
    private int _salary;

    .....

    public override string ToString()
    {
        return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary);
    }
}

Посмотрите на String.Format Method

Заменяет каждый элемент формата в указанной строке текстовым эквивалентом значения соответствующего объекта.

blockquote>

12
задан Ashwin Nanjappa 22 October 2009 в 08:59
поделиться

6 ответов

Простой рекурсивный чек будет достаточно, и как можно раньше вернемся, мы предполагаем, что вход не является списком или содержит не-списки, он не пуст

def isEmpty(alist):
    try:
        for a in alist:
            if not isEmpty(a):
                return False
    except:
        # we will reach here if alist is not a iterator/list
        return False

    return True

alist = []
blist = [alist]               # [[]]
clist = [alist, alist, alist] # [[], [], []]
dlist = [blist]               # [[[]]]
elist = [1, isEmpty, dlist]

if isEmpty(alist): 
    print "alist is empty"

if isEmpty(dlist): 
    print "dlist is empty"

if not isEmpty(elist): 
    print "elist is not empty"

Вы можете еще больше его улучшить для проверки рекурсивного списка или отсутствия объектов списка, или может быть пустым dicts и т. д.

11
ответ дан Ashwin Nanjappa 17 August 2018 в 13:52
поделиться
  • 1
    isEmpty([1]) терпит неудачу, это довольно проблема (не очень полезно иметь функцию для проверки пустого списка, если она работает только со списками, которые, как вы знаете, пусты). – Pierre Bourdon 20 October 2009 в 11:14
  • 2
    это может быть хорошей логикой, чтобы проверить, не является ли список пустым :) – Anurag Uniyal 20 October 2009 в 11:20
  • 3
    DelRoth: Анураг, похоже, теперь исправил проблему, которую вы прокомментировали сейчас. – Ashwin Nanjappa 21 October 2009 в 03:48
  • 4
    Ants Asama: Мне нравится простота вашего решения, лучшее! Я отредактировал ваш ответ и перешел на простое решение. Благодаря! :-) – Ashwin Nanjappa 22 October 2009 в 09:01
  • 5
    return all(map(isListEmpty, inList)) if isinstance(inList, list) else False :) – Stephan202 22 October 2009 в 09:45
  • 6
    Stephan202: Да, это превращает его в настоящую лайнер! Однако я просто не уверен в этом условном выражении Python. Немного запутанный, поскольку он не упорядочен так же, как C-тернарный оператор ;-) – Ashwin Nanjappa 22 October 2009 в 14:50
  • 7
    спасибо, вы спасли меня много времени на поиск .. все другие подходы не сработали для меня, кроме твоих .. thamks – Mo J. Mughrabi 6 June 2014 в 15:24
11
ответ дан Ashwin Nanjappa 6 September 2018 в 09:36
поделиться
11
ответ дан Ashwin Nanjappa 29 October 2018 в 16:08
поделиться
def isEmpty(a):
    return all([isEmpty(b) for b in a]) if isinstance(a, list) else False

Просто.

0
ответ дан Nitoref 17 August 2018 в 13:52
поделиться

Я не думаю, что есть очевидный способ сделать это в Python. Лучше всего было бы использовать рекурсивную функцию, подобную этой:

def empty(li):
    if li == []:
        return True
    else:
        return all((isinstance(sli, list) and empty(sli)) for sli in li)

Обратите внимание, что all поставляется только с Python> = 2.5 и что он не будет обрабатывать бесконечно рекурсивные списки (например, a = []; a.append(a)).

4
ответ дан Pierre Bourdon 17 August 2018 в 13:52
поделиться
  • 1
    Приятно, я никогда не думал о бесконечных рекурсивных списках в Python. Приятно видеть, что их можно даже напечатать ;-) – Jochen Ritzel 20 October 2009 в 12:45
  • 2
    +1 для бесконечных рекурсивных списков. Теперь до этот вопрос читал о них. – Michael Dunn 7 December 2011 в 10:04

Простой код работает для любого итерабельного объекта, а не только для списков:

>>> def empty(seq):
...     try:
...         return all(map(empty, seq))
...     except TypeError:
...         return False
...
>>> empty([])
True
>>> empty([4])
False
>>> empty([[]])
True
>>> empty([[], []])
True
>>> empty([[], [8]])
False
>>> empty([[], (False for _ in range(0))])
True
>>> empty([[], (False for _ in range(1))])
False
>>> empty([[], (True for _ in range(1))])
False

Этот код делает предположение, что все, что может быть повторено, будет содержать другие элементы и не должно рассматриваться как лист в дереве". Если попытка выполнить итерацию по объекту не удалась, то это не последовательность и, следовательно, конечно, не пустая последовательность (при этом возвращается False). Наконец, этот код использует тот факт, что all возвращает True, если его аргумент является пустой последовательностью.

7
ответ дан Stephan202 17 August 2018 в 13:52
поделиться
  • 1
    Ловить все исключения - это плохо, что может привести к скрытию реальных ошибок в коде. – Denis Otkidach 20 October 2009 в 12:19
  • 2
    @Denis: действительная точка. Теперь сузился до TypeError. – Stephan202 20 October 2009 в 12:38
  • 3
    +1, но я думаю, что map не следует использовать в Python. all( empty(x) for x in seq ) звучит намного приятнее для меня ;-) – Jochen Ritzel 20 October 2009 в 12:51
  • 4
    Это не работает для каких-либо итераций. Попробуйте передать ему строку. – Wilduck 11 January 2011 в 20:44
Другие вопросы по тегам:

Похожие вопросы: