Использование методов внутри понимания списка с несколькими циклами for и алгоритмом

#python-3.x #algorithm

Вопрос:

Я практикуюсь в понимании списков на python. Попытка создать список списков с указанием некоторых условий. Поэтому я написал эту программу:

 def perm(x,y,z,n):
    a = range(x y z)
    b = []
    for i in a:
        for j in a:
            for k in a:
                if 0 <= i <= x and 0 <= j <= y and 0 <= k <= z and i j k != n:
                    b.append([i,j,k])
    return b
print(perm(1,1,2,3))
 

[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 2]]

Это именно тот результат, который мне нужен. но если я попробую это сделать, используя понимание списка:

 return ([b.append(i) for i in a for j in a for k in a if 0 <= i <=x and 0 <= j <= y and 0 <= k <= z and i k j != n])
Or
return b.append[(i for i in a for j in a for k in a if 0 <= i <=x and 0 <= j <= y and 0 <= k <= z and i k j != n])
 

Он возвращает список » Нет » или «Нет».

Как мне это исправить? Кроме того, я изучаю алгоритмы и пытаюсь понять. Я прочитал несколько статей, но запутался. У меня были такие вопросы, как, например, как рассчитать эффективность любой данной программы, подобной этой? Есть ли стандартный способ? Как я узнаю, нужно ли мне изменить свой код, чтобы получить наилучший результат? Если кто-то может изложить это для меня в самых общих чертах или если тема слишком велика, чтобы ее охватить, то указание на некоторые ресурсы было бы очень полезным. Спасибо!

Ответ №1:

list.append действительно возвращается None . Что вам нужно было бы сделать:

 def perm(x,y,z,n):
    a = range(x y z)
    return [[i,j,k] for i in a for j in a for k in a if 0 <= i <= x and 0 <= j <= y and 0 <= k <= z and i j k != n]
   
 

В общем, следующие два эквивалентны (имена переменных просто случайны, они не имеют ничего общего с вашим примером):

 lst = []
for a in x:
    for b in y:
        if c:
            lst.append(d)

lst = [d for a in x for b in y if c]
 

Комментарии:

1. значит, я не могу использовать методы внутри понимания списка?

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

3. Общий синтаксис для понимания списка-list = [выражение для элемента в списке, если предикат] Предикатом может быть функция, если она возвращает логическое ИЗМЕНЕНИЕ: не нужно брать элементы списка

4. @BrakkeBaviaan Неверно: predicate может быть любое выражение любого типа, и оно не нуждается в какой-либо связи с тем, что повторяется.

5. Спасибо! это было полезно