#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. Спасибо! это было полезно