Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 21, 2010 14:45:49

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

Здравствуйте.
В ANSI C есть возможность создавать хитрые циклы вида for(int i=0, int j=30; i<20, j>=5; i++) (пример из головы, особо не вдумывайтесь)
Как на пайтоне реализовать подобные извращения?
Заранее спасибо.



Офлайн

#2 Ноя. 21, 2010 15:24:30

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

Python принципиально против изращений



Офлайн

#3 Ноя. 21, 2010 17:26:46

uhbif19
От:
Зарегистрирован: 2010-05-22
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

Чтобы такое сделать нужно использовать вложеные циклы. В отличие от си, где сразу образуется нагромождение скобок, в питоне это быдет выглядеть довольно акуратно.

А ваша конструкция действительно извращение (: Бесполезное и трудно читаемое.



Офлайн

#4 Ноя. 22, 2010 01:00:59

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

хорошо. тогда пример из жизни.

#define ROW_COUNT 35   // количество строк
#define COL_COUNT 24 // количество столбцов

for (int j=ROW_COUNT-1;j>=0;j--)
{
for (int i=14;i>=0;i--)
{
printf(formatString,Amplitudes[i][j]);
}
for (int i=COL_COUNT-1;i>14;i--)
{
printf(formatString,Amplitudes[i][j]);
}
printf("\n");
т.е. имеем некоторый массив, и нам в нем нужно особым способом переставить ячейки. причем не просто вывести на экран (как в этом примере), а занести в другой двумерный массив (Занос значения в который идет в обычном порядке, по возрастающей). В С я бы добавил еще по одному счетчику в объявления цикла и не парился, в пайтоне что то до меня совершенно не доходит что с эти можно придумать.



Офлайн

#5 Ноя. 22, 2010 01:21:12

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

можно конечно добавлять все значения в одномерный список, а потом из одномерного списка другим циклом формировать 2-мерный, но разве это не будет еще большим извращением?



Офлайн

#6 Ноя. 22, 2010 01:24:37

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

:)
можно так попробовать, если ничего интереснее в голову не приходит:

ROW_COUNT = 35
COL_COUNT = 24
for j in xrange(ROW_COUNT-1,-1,-1):
for i in xrange(14,-1,-1):
print i,j
for i in xrange(COL_COUNT-1,-1,-1):
print i, j



Офлайн

#7 Ноя. 22, 2010 01:35:46

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

ofigetitelno
:)
можно так попробовать, если ничего интереснее в голову не приходит:
ROW_COUNT = 35
COL_COUNT = 24
for j in xrange(ROW_COUNT-1,-1,-1):
for i in xrange(14,-1,-1):
print i,j
for i in xrange(COL_COUNT-1,-1,-1):
print i, j
черт возьми, именно так я и сделал, но этот цикл выводит на экран, а не в 2-х мерный список, индексируемый отдельно. :-)



Офлайн

#8 Ноя. 22, 2010 01:46:36

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

т.е. на С нужный мне цикл приобрел бы следующую форму

#define ROW_COUNT 35   // количество строк
#define COL_COUNT 24 // количество столбцов

int newArr[COL_COUNT][ROW_COUNT]

for (int j=ROW_COUNT-1, int k=0 ; j>=0, k < ROW_COUNT; j--, k++)
{
for (int i=14, int m=0; i>=0, m < 14 ; i--, m++)
{
newArr[m][k] = Amplitudes[i][j];
}
for (int i=COL_COUNT-1, int m=14; i>14, m < COL_COUNT ;i--, m++)
{
newArr[m][k] = Amplitudes[i][j];
}
}
а на пайтоне?



Отредактировано (Ноя. 22, 2010 01:48:41)

Офлайн

#9 Ноя. 22, 2010 02:05:20

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

:)
примерно так, возможно где-то с индексами что-то перепутал:

ROW_COUNT = 35
COL_COUNT = 24
newArr = [[None for x in xrange(ROW_COUNT)] for y in xrange(COL_COUNT)]
for j, k in zip(xrange(ROW_COUNT-1,-1,-1), xrange(ROW_COUNT)):
for i, m in zip(xrange(14,-1,-1), xrange(14)):
newArr[m][k] = (i, j)
for i, m in zip(xrange(COL_COUNT-1,13,-1), xrange(14, COL_COUNT)):
newArr[m][k] = (i, j)



Офлайн

#10 Ноя. 22, 2010 02:35:13

billy_bob
От:
Зарегистрирован: 2010-11-01
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

продвинутые циклы

во! спасибо, то, чего я так долго ждал. А то в документации не нашёл, что так можно делать.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version