Форум сайта python.su
Всем доброго времени суток! Не так давно начал изучать программирование в Python. При изучении цикла for решил попрактиковаться и написать генератор возможных комбинаций по трем спискам, естесственно запутался и вот я тут скорее всего ошибка в чем то очень простом, но я уже несколько дней не могу понять в чем именно (видимо плохо усвоил материал). Вот мой код:
a = ['A', 'B', 'C', 'D']
b = ['a', 'b', 'c', 'd']
n = ['1', '2', '3', '4']
temp = []
ax = 0 # индекс по списку a
bx = 0 # индекс по списку b
nx = 0 # индекс по списку n
tempx = 0 # индекс по создающемуся списку temp
for item in a: #
for item in b: # И ВООБЩЕ ПРАВИЛЬНА ЛИ ДАННАЯ КОНСТРУКЦИЯ??
for item in n: #
temp.insert(tempx, a[ax] + b[bx] + n[nx])
tempx = tempx + 1
nx = nx + 1
if nx > len(n) - 1:
ax = 0
bx = bx + 1
nx = 0
if bx > len(b) - 1:
ax = ax + 1
bx = 0
nx = 0
print(temp)
Офлайн
мне кажется что вариантов больше чем 64 если не ошибаюсь то 172 но исходя из вашего условия то
a = ['A', 'B', 'C', 'D'] b = ['a', 'b', 'c', 'd'] n = ['1', '2', '3', '4'] res = [] for i in a: for j in b: for x in n: res.append(i+j+x) print(len(res))
Отредактировано marvellik (Июль 13, 2016 12:39:37)
Офлайн
>>> import itertools >>> >>> a = ['A', 'B', 'C', 'D'] >>> b = ['a', 'b', 'c', 'd'] >>> c = ['1', '2', '3', '4'] >>> >>> list(itertools.product(a, b, c)) [('A', 'a', '1'), ('A', 'a', '2'), ('A', 'a', '3'), ('A', 'a', '4'), ('A', 'b', '1'), ('A', 'b', '2'), ('A', 'b', '3'), ('A', 'b', '4'), ('A', 'c', '1'), ('A', 'c', '2'), ('A', 'c', '3'), ('A', 'c', '4'), ('A', 'd', '1'), ('A', 'd', '2'), ('A', 'd', '3'), ('A', 'd', '4'), ('B', 'a', '1'), ('B', 'a', '2'), ('B', 'a', '3'), ('B', 'a', '4'), ('B', 'b', '1'), ('B', 'b', '2'), ('B', 'b', '3'), ('B', 'b', '4'), ('B', 'c', '1'), ('B', 'c', '2'), ('B', 'c', '3'), ('B', 'c', '4'), ('B', 'd', '1'), ('B', 'd', '2'), ('B', 'd', '3'), ('B', 'd', '4'), ('C', 'a', '1'), ('C', 'a', '2'), ('C', 'a', '3'), ('C', 'a', '4'), ('C', 'b', '1'), ('C', 'b', '2'), ('C', 'b', '3'), ('C', 'b', '4'), ('C', 'c', '1'), ('C', 'c', '2'), ('C', 'c', '3'), ('C', 'c', '4'), ('C', 'd', '1'), ('C', 'd', '2'), ('C', 'd', '3'), ('C', 'd', '4'), ('D', 'a', '1'), ('D', 'a', '2'), ('D', 'a', '3'), ('D', 'a', '4'), ('D', 'b', '1'), ('D', 'b', '2'), ('D', 'b', '3'), ('D', 'b', '4'), ('D', 'c', '1'), ('D', 'c', '2'), ('D', 'c', '3'), ('D', 'c', '4'), ('D', 'd', '1'), ('D', 'd', '2'), ('D', 'd', '3'), ('D', 'd', '4')] >>> len(_) 64 >>>
>>> a = ['A', 'B', 'C', 'D'] >>> b = ['a', 'b', 'c', 'd'] >>> c = ['1', '2', '3', '4'] >>> >>> [i + j + k for i in a for j in b for k in c] ['Aa1', 'Aa2', 'Aa3', 'Aa4', 'Ab1', 'Ab2', 'Ab3', 'Ab4', 'Ac1', 'Ac2', 'Ac3', 'Ac4', 'Ad1', 'Ad2', 'Ad3', 'Ad4', 'Ba1', 'Ba2', 'Ba3', 'Ba4', 'Bb1', 'Bb2', 'Bb3', 'Bb4', 'Bc1', 'Bc2', 'Bc3', 'Bc4', 'Bd1', 'Bd2', 'Bd3', 'Bd4', 'Ca1', 'Ca2', 'Ca3', 'Ca4', 'Cb1', 'Cb2', 'Cb3', 'Cb4', 'Cc1', 'Cc2', 'Cc3', 'Cc4', 'Cd1', 'Cd2', 'Cd3', 'Cd4', 'Da1', 'Da2', 'Da3', 'Da4', 'Db1', 'Db2', 'Db3', 'Db4', 'Dc1', 'Dc2', 'Dc3', 'Dc4', 'Dd1', 'Dd2', 'Dd3', 'Dd4'] >>>
Отредактировано py.user.next (Июль 13, 2016 13:29:43)
Офлайн
marvellikСпасибо за совет по коду! Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса. Про метод .append() знаю, но специально не стал его употреблять, а идти сложным путем
мне кажется что вариантов больше чем 64 если не ошибаюсь то 172 но исходя из вашего условия то
Отредактировано san_911 (Июль 13, 2016 17:56:50)
Офлайн
Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса.но только в гамаке и стоя(с) я как бы не специалист, но чтоб понять логику действия циклов надо почитать про итерацию. а не делать громоздкие условия. имхо, конечно.
И, кстати, там на самом деле должно 64 комбинации получиться, т.к. в каждая из вариаций должна состоять из 3х символов принадлежащих разным спискам.ну используя ваши циклы точно не получится. если рассматривать с момента где все идет наперекосяк. начинается второе прохождение первого цикла(В), прошел первый раз второй цикл(а), во время которого 4 раза прошел третий цикл(1,2,3,4). в результате чего nx == 4, а дальше во втором цикле идет условие:
if nx > len(n) - 1: ax = 0 bx = bx + 1 nx = 0
temp.insert(tempx, a[ax] + b[bx] + n[nx])
temp.insert(tempx, a[0] + b[1] + n[0)
Офлайн
Спасибо! теперь понял в чем ошибка
Офлайн