Уведомления

Группа в Telegram: @pythonsu

#1 Июль 13, 2016 10:26:36

san_911
Зарегистрирован: 2016-07-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

Всем доброго времени суток! Не так давно начал изучать программирование в 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, и не могу найти подобных примеров…
Ребят, если кто-нить может показать как следует исправить данный код, пожалуйста помогите чайнику! Заранее спасибо!!!

Офлайн

#2 Июль 13, 2016 12:37:33

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

мне кажется что вариантов больше чем 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

Отредактировано marvellik (Июль 13, 2016 12:39:37)

Офлайн

#3 Июль 13, 2016 13:24:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

>>> 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)

Офлайн

#4 Июль 13, 2016 17:51:38

san_911
Зарегистрирован: 2016-07-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

marvellik
мне кажется что вариантов больше чем 64 если не ошибаюсь то 172 но исходя из вашего условия то
Спасибо за совет по коду! Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса. Про метод .append() знаю, но специально не стал его употреблять, а идти сложным путем
Изучаю Python по видеокурсу “Ленивый питон” на youtube, и там были приведены именно такие конструкции, как я расписал в своем коде (только с двумя исходными списками), вот мне и стало интересно, как используя эту структуру написать код по трем спискам. Может я и заморочился конечно, но правда хочется понять
И, кстати, там на самом деле должно 64 комбинации получиться, т.к. в каждая из вариаций должна состоять из 3х символов принадлежащих разным спискам.

Отредактировано san_911 (Июль 13, 2016 17:56:50)

Офлайн

#5 Июль 13, 2016 18:58:55

shaptmos
Зарегистрирован: 2015-12-12
Сообщения: 27
Репутация: +  4  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

Но дело в том, что я задался целью использовать именно все эти громоздкие условия, чтобы понять саму логику цикла и всего процесса.
но только в гамаке и стоя(с) я как бы не специалист, но чтоб понять логику действия циклов надо почитать про итерацию. а не делать громоздкие условия. имхо, конечно.
И, кстати, там на самом деле должно 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

Офлайн

#6 Июль 13, 2016 21:53:13

san_911
Зарегистрирован: 2016-07-13
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите чайнику исправить код?

Спасибо! теперь понял в чем ошибка

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version