История изменений
Исправление 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;
}
}