2014-11-01 1 views
1

Im пытаясь подсчитать количество элементов в вложенном списке, список выглядит следующим образом:Подсчет числа элементов в вложенном списке

[(1944, ['Hughes H']), 
(1940, ['Hill DK', 'Crawford GN', 'Greene HS', 'Myers J', 'Burr GO']), 
(1941, 
    ['McClung CE', 
    'Sumner FB', 
    'Gates RR', 
    'Lewis WH', 
    'Haas O', 
    'Haas O', 
    'Gould BS', 
    'Tytell AA', 
    'Hatch MH']), 
(1942, 
    ['Gaffron H', 
    'Gardner FT', 
    'Edwards PR', 
    'Bruner DW', 
    'Lake NC', 
    'Ratner B', 
    'Gaffron H', 
    'Rubin J', 
    'Ritter WE']), 
(1943, 
    ['Bousfield G', 
    'Fishbein M', 
    'Faber HK', 
    'Silverberg RJ', 
    'Dong L', 
    'Howorth MB'])] 

Это код используется, чтобы получить этот результат:

d = defaultdict(list) 
for k, v in authors_expanded: 
     d[k].append(v) 

d.items() 

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

len(d.items())-1 

с первого элемента списка всегда содержит один элемент. Я ищу более приятное решение.

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

+1

что бы вы хотели быть результатом для этого примера? –

+0

Подсчитайте, сколько? Количество записей в вашем словаре? Это будет 'len (d)' непосредственно, не нужно называть 'd.items()'. Можете ли вы объяснить, каким образом 'len (d.items()) - вам нужен ответ? – Soravux

ответ

0

Если вы ищете число авторов в год, вы могли бы использовать это:

# Authors per year 
authors_per_year = { year: len(authors) for year, authors in the_list } 

дает вам это:

{1940: 5, 1941: 9, 1942: 9, 1943: 6, 1944: 1} 

Или, если вы ищете отсчет уникальных авторов, то вы могли бы использовать это:

# Unique authors 
unique_authors = set([ a for year, authors in the_list 
          for a in authors]) 

дает вам этот набор:

set(['Bousfield G', 
    'Bruner DW', 
    'Burr GO', 
    'Crawford GN', 
    'Dong L', 
    'Edwards PR', 
    'Faber HK', 
    'Fishbein M', 
    'Gaffron H', 
    'Gardner FT', 
    'Gates RR', 
    'Gould BS', 
    'Greene HS', 
    'Haas O', 
    'Hatch MH', 
    'Hill DK', 
    'Howorth MB', 
    'Hughes H', 
    'Lake NC', 
    'Lewis WH', 
    'McClung CE', 
    'Myers J', 
    'Ratner B', 
    'Ritter WE', 
    'Rubin J', 
    'Silverberg RJ', 
    'Sumner FB', 
    'Tytell AA']) 

Так len(unique_authors) дает подсчет 28.

В любом случае, я думаю, что для вас может быть использована некоторая комбинация list comprehensions или dict comprehension.

0

Что вам нужно, это рекурсия. Функция, которая вызывает себя. Тестирование для типа при повторе в списке и если его другой список рекурсивно подсчитывает элементы внутри. Посмотрите ниже, чтобы сделать трюк. Это будет работать независимо от того, сколько вложенных списков имеет и как глубоко вам нужно идти. Вы также можете подсчитывать вложенные кортежи и dicts, хотя, если вам не нужно проверять их, я бы их удалил.

items = ['item1',['item2',['item3','item4']]] 

def count_items(items): 
    number = 0 
    for i in items: 
     variable_type = type(i) 
     if variable_type is list or variable_type is tuple or variable_type is dict: 
      number = number + count_items(i) 
     else: 
      number = number + 1 
    return number 

print count_items(items) 
0
[ len(y) for x,y in your_list ] 

выход

[1, 5, 9, 9, 6] 

Я беру х, у пары, у есть вложенный список. Я использую len функцию, чтобы дать номер элемента в списке