Найти - Пользователи
Полная версия: Помогите чайнику исправить код?
Начало » Python для новичков » Помогите чайнику исправить код?
1
san_911
Всем доброго времени суток! Не так давно начал изучать программирование в 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 варианта возможных сочетаний (от Аа1 до Dd4). Но запустив код, обнаружил, что он генерирует правильно до Ba4, и потом происходит сброс к Ab1 и далее идет их чередование).
Проблема в том, что в видеокурсе был показан пример с двумя списками, а я решил замахнуться сразу на 3, и не могу найти подобных примеров…
Ребят, если кто-нить может показать как следует исправить данный код, пожалуйста помогите чайнику! Заранее спасибо!!!
marvellik
мне кажется что вариантов больше чем 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))
>>> 64
py.user.next
>>> 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']
>>>
san_911
marvellik
мне кажется что вариантов больше чем 64 если не ошибаюсь то 172 но исходя из вашего условия то
Спасибо за совет по коду! Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса. Про метод .append() знаю, но специально не стал его употреблять, а идти сложным путем
Изучаю Python по видеокурсу “Ленивый питон” на youtube, и там были приведены именно такие конструкции, как я расписал в своем коде (только с двумя исходными списками), вот мне и стало интересно, как используя эту структуру написать код по трем спискам. Может я и заморочился конечно, но правда хочется понять
И, кстати, там на самом деле должно 64 комбинации получиться, т.к. в каждая из вариаций должна состоять из 3х символов принадлежащих разным спискам.
shaptmos
Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса.
но только в гамаке и стоя(с) я как бы не специалист, но чтоб понять логику действия циклов надо почитать про итерацию. а не делать громоздкие условия. имхо, конечно.
И, кстати, там на самом деле должно 64 комбинации получиться, т.к. в каждая из вариаций должна состоять из 3х символов принадлежащих разным спискам.
ну используя ваши циклы точно не получится. если рассматривать с момента где все идет наперекосяк. начинается второе прохождение первого цикла(В), прошел первый раз второй цикл(а), во время которого 4 раза прошел третий цикл(1,2,3,4). в результате чего nx == 4, а дальше во втором цикле идет условие:
       
 if nx > len(n) - 1:
            ax = 0
            bx = bx + 1
            nx = 0
которое и выполняется т.к. 4 > len(n) - 1, и при следующем прохождении второго цикла(b)
temp.insert(tempx, a[ax] + b[bx] + n[nx])
в эту строчку добавляются значения которые вы определили, то есть
temp.insert(tempx, a[0] + b[1] + n[0)
, соответственно на выходе после Ba4 идет Аb1

san_911
Спасибо! теперь понял в чем ошибка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB