LINUX.ORG.RU

История изменений

Исправление soomrack, (текущая версия) :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); task != tasks.end();) {
   Task new_task = proceed(task);
   if(new_task.type == NONE) {
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

PS: совсем отвык без IDE набирать программы.

Исправление soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   Task new_task = proceed(task);
   if(new_task.type == NONE) {
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

Исправление soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   new_task = proceed(task);
   if(new_task.type == NONE) {
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

Исправление soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   new_task = proceed(task);
   if(new_task.type == NONE) {
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

Исправление soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   new_task = proceed(tasks.front());
   if(new_task.type == NONE) {
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

Исправление soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   new_task = proceed(tasks.front());
   if(new_task.type == 'NONE') {
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == 'REPLACE')
       tasks.insert(task, new_task);
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == 'PUSH_AFTER')
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == 'PUSH_BACK')
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

Исходная версия soomrack, :

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

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

Скажем, фактически нужно:

for(auto task = tasks.begin(); tasks != tasks.end();) {
   new_task = proceed(tasks.front());
   if(new_task.type == 'NONE') {
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == 'REPLACE')
       tasks.insert(task, new_task);
       task++;
       tasks.pop_front();
       continue;
   }
   if(new_task.type == 'PUSH_AFTER')
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == 'PUSH_BACK')
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}