2014-02-06 4 views
1

Здравствуйте, я пытаюсь подсчитать все элементы в списке списков. НапримерСписок элементов списка списка Python

a = [[1,2],[3,4],[10,3,8]] 

Я хочу вернуться:

7 

Я пытался их количество и размер не повезло. Спасибо заранее.

+1

Для множественных уровней глубоко 'Len (. Ул (а) .strip ('[]') Раскол (''))' Edit I попробовал здесь: http://ideone.com/gzpt65 –

+0

для вашего списка: http://ideone.com/U1f93P –

ответ

6
a = [[1,2],[3,4],[10,3,8]] 
print(sum(map(len, a))) 

Выход

7 

Это можно записать в виде выражения генератора, как этот

print(sum(len(item) for item in a)) 

Самый простой метод, который будет работать даже для многоуровневых вложенных списков, выглядит следующим образом

def get_size(current_item): 
    if isinstance(current_item, list): 
     return sum(get_size(item) for item in current_item) 
    else: 
     return 1 

a = [[1,2],[3,4],[10,3,8],[[1, 2, 3], [2, 3]]] 
print get_size(a) # 12 
+1

Обратите внимание, что это не будет работать, если ваши списки имеют многоуровневые уровни. В этом случае вам понадобится рекурсивное решение. –

+1

@adsmith Согласен, но OP говорит, что просто «список списков» – thefourtheye

+1

На самом деле, поскольку вопросник хочет подсчитать элементы в списке списков, то рекурсия через любое количество уровней списка даст неверный ответ в случае где списки более глубокие. Речь идет о том, хотите ли вы, чтобы для параметра [[[1,2]]] 'был равен 1 (количество элементов в списке-списках: этот один элемент является списком) или 2 (количество элементов на любом уровне вложенных списков). –

0

Вы можете либо суммировать длины (например, @thefourtheye предложил), или перебрать все элементы, и посчитайте:

sum(len(b) for b in a) 
sum(1 for b in a for c in b) 

Первый способ, безусловно, лучше, но второй хорош для демонстрации некоторых вещей, которые вы можете сделать со списком, а также будет работать над более общей структурой, итерабельными итерами (которые не имеют __len__).

+0

Для повторения итераций вы, вероятно, захотите заменить использование 'len' чем-то вроде' def mylen (iterable): try: return len (iterable), кроме TypeError: return sum (1 для x в итерабельном) '. То есть, делайте это быстро для итераций, где это возможно, в противном случае медленнее. –

1

Для академических целей, если ваш список более чем на один уровень (например, [ [1,2,3], [4,5,[6,7,8]]], один из ваших элементов содержит список), вы хотите сделать что-то вроде:

def count_elements(target): 
    count = 0 
    for element in target: 
     if type(element) is list: 
      count += count_elements(element) 
     else: 
      count += 1 
    return count 

Но проблемы, как описано по OP легче решить один из других ответов. Просто отметим, что эти решения нелегко масштабируются.

0
def myLen(L): 
    if not L: 
     return 0 
    elif not isinstance(L[0], list): 
     return 1 + myLen(L[1:]) 
    else: 
     return myLen(L[0]) + myLen(L[1:]) 

Выход:

>>> myLen([[1,2],[3,4],[10,3,8]]) 
7 
0
list_count = 0 

mainList = [[1,2],[3,4],[10,3,8]] 
for inner_list in mainList: 
    list_count += len(inner_list) 

print(list_count) 
Смежные вопросы