| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Python: Общие вопросы > Создание генератора списка |
| Автор: nerezus 14.11.2006, 10:29 | ||
| Есть класс. У него есть метод getItem() Надо, чтобы при каждом вызове метода он выдавал некоторое значение. Теперь про значение: есть 2 числа-границы. Например 1 и 6. Есть строка типа "abcdefghklmnopqrstuvwxyz" Т.е. значения должны быть такие:
Вместо точек - пропуски. Вот как такое организовать? хотел рекурсией, но тогда придется создавать список, куда добавлять эти значения, а так делать нельзя, ибо трата оперативы. |
| Автор: albertn 14.11.2006, 11:37 | ||
Помучился, но получилось:
|
| Автор: Artemios 14.11.2006, 11:40 | ||
Только вместо 2-ки 6-кой инициализировать не советую, все-таки 36^6 строк выводить будет |
| Автор: ser_gen 14.11.2006, 11:41 | ||
| Выдавать по одному из функции можно с помощью yield Что-то вроде return толко при следующем вызове продолжит выполнение со следующей строки функции (после yield)
А алгоритм ищи в книгах по дискретной математики (кажись эта генерация всех возможных комбинаций там должна быть) |
| Автор: nerezus 14.11.2006, 11:47 |
| есть вариант об использовании новой системы счисления, база которой равна длине строки. Вот сейчас про него думаю. ser_gen, т.е. просто состояние переменных метода сохранится? будет ли это работать в классах? Добавлено @ 11:47 Artemios, спасибо, сейчас посмотрим Добавлено @ 11:48 albertn, спасибо. Что у меня за плохая привычка смотреть темы снизу ) |
| Автор: nerezus 14.11.2006, 11:58 |
| А вот такой вопрос: имеется функция-генератор(из примера albertn). Как снять с нее 1 значение? |
| Автор: albertn 14.11.2006, 12:04 | ||||
Используя метод next
Но только по окончанию он вызывает экскепшон |
| Автор: nerezus 14.11.2006, 12:14 | ||||
| спасибо Добавлено @ 12:23 получилось все.
где
еще раз спасибо ) |
| Автор: slav0nic 14.11.2006, 12:32 | ||
| мм, документацию читать не модно нынче=) в туториале есть пример интересный, для генерации всех комбинаций, думаю переписать его не сложно
|
| Автор: nerezus 14.11.2006, 12:34 |
| slav0nic, это откуда? |
| Автор: slav0nic 14.11.2006, 12:37 |
| nerezus, ну ген из оффициальной доки вроде бы брался) 2.1.8 Indentation |
| Автор: Artemios 14.11.2006, 12:46 | ||||
Мне тоже стало интересно, попробовал:
только здесь вычислений больше производится |
| Автор: slav0nic 14.11.2006, 12:56 |
| nerezus, короче профилировщик в зубы и тести что быстрее |
| Автор: albertn 14.11.2006, 13:00 | ||||
Но только есть одна загвоздка. Ни в какой системе счисления нельзя задать число начинающееся с нуля (кроме самого нуля). Тогда надо будет уже указывать количество используемых единиц. |
| Автор: Artemios 14.11.2006, 13:04 |
сие интерпретатор не понимает, меняем на gen(s) -- имеем рекурсию. А вообще -- генерит всего лишь перестановки. |
| Автор: Artemios 14.11.2006, 13:37 | ||||
Вот новый вариант позиционной системы, так вроде все замечательно:
|
| Автор: albertn 15.11.2006, 11:35 | ||
nerezus по-моему имел ввиду другое. Ему нужен был не способ генерации, основанный на системе счисления, а способ преобразования из десятичной системы (или шестнадцатиричной) в ту, которая задана текущим алфавитом. А твой вариант мало чем отличаеся от всех предыдущих, разве что алгоритмом. |
| Автор: nerezus 15.11.2006, 11:45 |
| albertn, да нет, мне нужно было просто составить все возможные комбинации(с повторениями и т.д.) Это уже сделано. Просто переход на новую систему счисления - это один из способов решения ) Кстати еще способ придумали: на вход идет предудущее "число"(или просто лежит как self.prev), а по нему составляется следующее. ИМХО наиболее простой способ ;) |
| Автор: Artemios 15.11.2006, 12:42 | ||||
Именно это и было в моем самом первом примере (в self.curr_l на каждой итерации - предыдущее, метод next() генерит следующее) И в более красивом примере albertn (первом) - то же, каждое следующее генерится в цикле на основе предыдущего (в state), с выбросом текущего по yield.
Скажем так, меня просто заинтересовала позиционная система с произвольным алфавитом и базой, а извращения над ней - для подгонки к генерации требуемых комбинаций Оправдался? |
| Автор: albertn 16.11.2006, 16:56 | ||
PS. Невиновным невчем оправдываться |
| Автор: nerezus 16.11.2006, 17:41 | ||
УУ, а вот твой пример то, хоть и выглядит самым красивым, а глючит нещадно Например, если поставить x1=3 x2=3, то.... |
| Автор: nerezus 16.11.2006, 18:38 | ||||
еще раз дам код:
c:\\1.txt
|
| Автор: nerezus 17.11.2006, 09:04 | ||
Для примера, если написать в 1.txt
то работает, как надо. |
| Автор: albertn 17.11.2006, 14:46 |
| nerezus, self.start >= self.finish в строке 15 замени на self.start > self.finish, тогда все заработает |
| Автор: nerezus 17.11.2006, 19:34 |
| А как сделать, чтобы повторяющихся символов не было? Можно конечно в список символы загнать и проверять, но... не изящно ) |
| Автор: albertn 20.11.2006, 14:02 | ||
А изящно и я немогу придумать че-то, разве что есть мысль полсе каждой выборки одного элемента уменьшать алфавит, и выбирать уже из нового. |
| Автор: nerezus 20.11.2006, 20:00 |
| Хм, а такой способ как будет выглядеть? Ибо у меня тупо проверкой в генерированной строке производится ) |
| Автор: albertn 21.11.2006, 09:44 | ||||
|