2012-03-31 3 views
2

У меня есть список как p = [[[[[[[[1, 2, 3]]]]]]]], я хочу получить количество элементов в списке, включая пустые списки, поэтому для этого списка мне нужно получить 10. Я пытаюсь перечислить список, например -Подсчет подсписок внутри списка в Python

for idx, item in enumerate(p): 
    count = count + idx 

, но я не могу получить пустые списки там. Пожалуйста посоветуй.

+3

Там нет пустых списков там. – jamylak

+0

Не могли бы вы объяснить, как получить 10 для этого списка? –

+0

Он подсчитывает количество элементов в каждом списке и добавляет их вместе – jamylak

ответ

6

Сокращенный вариант кода ниже:

>>> def recur_len(l): 
     return sum(1 + recur_len(item) if isinstance(item,list) else 1 for item in l) 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 

Более подробную код

>>> def recur_len(l): 
     count = 0 
     for item in l: 
      if isinstance(item,list): 
       count += 1 + recur_len(item) 
      else: 
       count += 1 
     return count 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 
+0

+1 Я оставлю свой ответ, но это то, что действительно было хотело ОП. Вопрос формулировки был не очень ясным, а пример неоднозначным. –

+0

Да, я согласен, я не понял всю «пустую вещь списка» – jamylak

+0

Спасибо, будет более описательным в следующий раз. Теперь пришло время сидеть и учиться, как этот код работает, спасибо большое – Varun

2

Если вы хотите посчитать списки (или подклассы list) и ничего кроме содержания окончательного списка не только содержащего другого списка:

def len_counting_containers(inlist): 
    count = 0 
    current = inlist 
    while len(current) == 1 and isinstance(current[0], list): 
     count += 1 
     current = current[0] 
    return count + len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

Который дает нам:

10 

Обратите внимание, что это довольно хрупкая операция (как и в любом случае, когда вы используете isinstance() в python) - поэтому вы хотите быть уверенным, что ваши входящие данные всегда структурированы так, как вы ожидаете. Если ваши данные поступают от источника, которым вы управляете, я бы рекомендовал посмотреть, как вы производите данные и видите, можете ли вы дать его в более удобной форме - например: (7, [1,2,3]).

Вы также можете реализовать рекурсивно:

def len_counting_containers(current): 
    return len_counting_containers(current[0])+1 if len(current) == 1 and isinstance(current[0], list) else len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

Это дает тот же результат, меньше кода, но если вы работаете с безумно большими списками это может ударить пределы рекурсии.

+0

Спасибо, я новичок здесь, поэтому стараюсь как можно больше понять, что, если я изменю список на myList = ([1, [1, 2, [3, 4]]]), я получаю только 2 для этой операции, но у меня есть 7 элементов, пожалуйста, объясните, я попытаюсь закодировать себя – Varun

+0

Ах, вы сказали, включая «пустые списки», поэтому я предположил, что вы имели в виду списки, содержащие только один пункт. Я думаю [ответ jamylak] (http://stackoverflow.com/a/9955769/722121) делает то, что вы хотите. –

2
def depth(a): 
    return 1 + depth(a[0]) if type(a) is list else 0 

Демо:

a = 'x' 
for n in range(10): 
    a = [a] 
    print a, depth(a) 


## ['x'] 1 
## [['x']] 2 
## [[['x']]] 3 
## [[[['x']]]] 4 
## [[[[['x']]]]] 5 
## [[[[[['x']]]]]] 6 
## [[[[[[['x']]]]]]] 7 
## [[[[[[[['x']]]]]]]] 8 
## [[[[[[[[['x']]]]]]]]] 9 
## [[[[[[[[[['x']]]]]]]]]] 10 
+0

'code' четкости deep_count (р): \t сумма = 0 \t при е р в: \t \t сумма = сумма + 1 \t \t, если is_list (е): \t \t \t сумма = сумма + deep_count (е) \t сумма возврата 'code' – Varun

Смежные вопросы