Если вы хотите посчитать списки (или подклассы 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]]]]]]]])
Это дает тот же результат, меньше кода, но если вы работаете с безумно большими списками это может ударить пределы рекурсии.
Там нет пустых списков там. – jamylak
Не могли бы вы объяснить, как получить 10 для этого списка? –
Он подсчитывает количество элементов в каждом списке и добавляет их вместе – jamylak