Получение длины списка списков списков списков - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть несколько странно выглядящие списки, подобные этому:

listlist = [[], [[[[], []], [[]], []]], [[]]]

, и я пытаюсь найти сумму всех длин списков.

Если бы это было просто многомерный массив (nxnxnx ...), найти общую сумму длин списков было бы очень легко, но в этом случае я не уверен, с чего мне начать.

Я пытался использовать 'для l oop', но я считаю, что это не является четким ответом на проблему такого рода, и должен быть действительно простой подход для решения проблемы такого рода.

Буду признателен за любой совет. Заранее спасибо! =]

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Вот возможное решение:

listlist = [[], [[[[], []], [[]], []]], [[]]]

def length(lst):
    return len(lst) + sum(length(l) for l in lst if isinstance(l, list))

print(length(listlist))

Вывод

11
0 голосов
/ 28 апреля 2020

Вот код, который должен делать то, что вы хотите.

Я включил две версии функции, одну для ясности, а другую, которая меньше, но функционально идентична.

####################
# Create a list of lists / elements
####################
#x = [[1,2,3],[3,4],[3,4,[3,4,5],[4],[5,4,6]],[4,3,4,5,[[[6]]]]]
x = [[], [[[[], []], [[]], []]], [[]]]

############################################################
# First implementation (included for clarity)
############################################################
def get_len_lists(this_list):
    # Set number of elements to 0
    num_elem = 0                              

    # Loop through each element in the list...
    for elem in this_list:                          

        # .. if it's a list...
        if type(elem) == list:                      

            # ... if the list is empty, count that as an element
            if elem == list():                      
                # ... so add one
                num_elem += 1                       
            else:
                # ... get the number of elements...
                num_elem += get_len_lists(elem) + 1 

        # ... otherwise...
        else:                                       
            # ... just add one to the length of the list
            num_elem += 1                           

    # Return the number of elements in the list
    return num_elem                                 


############################################################
# Smaller implementation
############################################################
def get_len_lists_2(this_list):
    # Set number of elements to 0
    num_elem = 0                                    

    # Loop through each element in the list...
    for elem in this_list:                          

        # We add one for each level, regardless of whether it is an element or a list
        num_elem += 1                              

        # If it's a list...
        if type(elem) == list:                      

            # .. get the number of elements in the list
            num_elem += get_len_lists(elem)         

    # Return the number of elements in the list
    return num_elem                                 


result1 = get_len_lists(x) + 1
result2 = get_len_lists_2(x) + 1

print(result1)
print(result2)

вывод:

12
12
0 голосов
/ 28 апреля 2020

Это может подтолкнуть вас в правильном направлении:

def lenall(lst):
    if isinstance(lst, list):
        return 1 + sum(map(lenall, lst))
    return 0

>>> lenall(listlist)
12

Это фактически подсчитывает общее количество списков в структуре данных. Если вы хотите добавить все их длины, вы должны изменить его на:

def lenall(lst):
    if isinstance(lst, list):
        return len(lst) + sum(map(lenall, lst))
    return 0

>>> lenall(listlist)
11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...