Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание генератора списка 
V
    Опции темы
Artemios
Дата 14.11.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(slav0nic @  14.11.2006,  12:32 Найти цитируемый пост)
для генерации всех комбинаций


Цитата(slav0nic @  14.11.2006,  12:32 Найти цитируемый пост)
gen[s](s)

сие интерпретатор не понимает, меняем на gen(s) -- имеем рекурсию.
А вообще -- генерит всего лишь перестановки.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 14.11.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(albertn @  14.11.2006,  13:00 Найти цитируемый пост)
Но только есть одна загвоздка. Ни в какой системе счисления нельзя задать число начинающееся с нуля (кроме самого нуля). Тогда надо будет уже указывать количество используемых единиц.

Вот новый вариант позиционной системы, так вроде все замечательно:
Код

def getitem(max_length):
  alf = map(chr,range(ord('a')-1,ord('z')+1))
  base = len(alf)
  max_num = base**max_length
  for i in xrange(max_num):
    if i%base:
      lst = []
      a=i
      while a:
        a,r = divmod(a,base)
        lst.append(alf[r])
      yield ''.join(reversed(lst))

for x in getitem(2):
  print x


Это сообщение отредактировал(а) Artemios - 14.11.2006, 13:44


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 15.11.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @  14.11.2006,  13:37 Найти цитируемый пост)
Вот новый вариант позиционной системы, так вроде все замечательно:

nerezus по-моему имел ввиду другое. Ему нужен был не способ генерации, основанный на системе счисления, а способ преобразования из десятичной системы (или шестнадцатиричной) в ту, которая задана текущим алфавитом. А твой вариант мало чем отличаеся от всех предыдущих, разве что алгоритмом.
PM WWW ICQ   Вверх
nerezus
Дата 15.11.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



albertn, да нет, мне нужно было просто составить все возможные комбинации(с повторениями и т.д.) Это уже сделано.
Просто переход на новую систему счисления - это один из способов решения )

Кстати еще способ придумали: на вход идет предудущее "число"(или просто лежит как self.prev), а по нему составляется следующее. ИМХО наиболее простой способ ;)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Artemios
Дата 15.11.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(nerezus @  15.11.2006,  11:45 Найти цитируемый пост)
Кстати еще способ придумали: на вход идет предудущее "число"(или просто лежит как self.prev), а по нему составляется следующее. ИМХО наиболее простой способ ;)

Именно это и было в моем самом первом примере 
(в self.curr_l на каждой итерации - предыдущее, метод next() генерит следующее)
И в более красивом примере albertn (первом) - то же, каждое следующее 
генерится в цикле на основе предыдущего (в state), с выбросом текущего по yield.

Цитата(albertn @  15.11.2006,  11:35 Найти цитируемый пост)
А твой вариант мало чем отличаеся от всех предыдущих, разве что алгоритмом. 

Скажем так, меня просто заинтересовала позиционная система с произвольным алфавитом и базой,
а извращения над ней - для подгонки к генерации требуемых комбинаций smile 
Оправдался? smile 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 16.11.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(Artemios @  15.11.2006,  12:42 Найти цитируемый пост)
Скажем так, меня просто заинтересовала позиционная система с произвольным алфавитом и базой,
а извращения над ней - для подгонки к генерации требуемых комбинаций smile 
Оправдался? smile  
В принципе, то все предложенные варианты в той или иной мере основываются на системе счисления. А вариантов я сходу бы штук пять бы сделал. Ведь не в этом суть, а в том, чтоб все это работало как можно быстрее.
PS. Невиновным невчем оправдываться smile
PM WWW ICQ   Вверх
nerezus
Дата 16.11.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Цитата

а в том, чтоб все это работало как можно быстрее.


УУ, а вот твой пример то, хоть и выглядит самым красивым, а глючит нещадно  smile 

Например, если поставить x1=3 x2=3, то....  smile 


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
nerezus
Дата 16.11.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



еще раз дам код: 
Код
class WQueueGen:
    def __init__(self, filename):
        import re, sys
        fh = open(filename, 'r')
        try:
            len_str      = fh.readline().strip()
            self.symbols = fh.readline().strip()
        except:
            print 'Cannot read config file'
            sys.exit(1)
        brd =  re.findall('\d+', len_str)
        self.start  = int(brd[0]) # нижняя длина строки
        self.finish = int(brd[1]) # верхняя длина строки
        self.empty  = False
        if (not self.symbols) or (self.start >= self.finish):
            self.empty = True
        self.len = self.start # текущая длина строки
        self.pos = 0          # текущая позиция
        self.gen = self.generator(self.start, self.finish, self.symbols)

    def generator(self, x1, x2, alfavit):
        for n in range(x1,x2+1):
            state = [0 for x in range(n)]
            memo = 0
            while memo==0:
                yield ''.join(map(alfavit.__getitem__,state))
                memo = 1
                for i in range(n):
                    state[n-i-1] += memo
                    if state[n-i-1]==len(alfavit):
                        state[n-i-1]=0
                        memo = 1
                    else:
                        memo = 0

    def isEmpty(self):
        return self.empty

    def getItem(self):
        try:
            return self.gen.next()
        except:
            self.empty = True
            return ''



q = WQueueGen('c:\\1.txt')
while not q.isEmpty():
    print q.getItem()




c:\\1.txt
Код

3-3
abc



--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
nerezus
Дата 17.11.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Для примера, если написать в 1.txt
Код

2-3
abc

то работает, как надо.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
albertn
Дата 17.11.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



nerezusself.start >= self.finish в строке 15 замени на self.start > self.finish, тогда все заработает smile
PM WWW ICQ   Вверх
nerezus
Дата 17.11.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



А как сделать, чтобы повторяющихся символов не было?
Можно конечно в список символы загнать и проверять, но... не изящно )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
albertn
Дата 20.11.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(nerezus @  17.11.2006,  19:34 Найти цитируемый пост)
А как сделать, чтобы повторяющихся символов не было?
Можно конечно в список символы загнать и проверять, но... не изящно ) 

А изящно и я немогу придумать че-то, разве что есть мысль полсе каждой выборки одного элемента уменьшать алфавит, и выбирать уже из нового.
PM WWW ICQ   Вверх
nerezus
Дата 20.11.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Хм, а такой способ как будет выглядеть? Ибо у меня тупо проверкой в генерированной строке производится )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
albertn
Дата 21.11.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(nerezus @  20.11.2006,  20:00 Найти цитируемый пост)
Хм, а такой способ как будет выглядеть? Ибо у меня тупо проверкой в генерированной строке производится ) 

Код

class WQueueGen:
    def __init__(self, filename):
        import re, sys
        fh = open(filename, 'r')
        try:
            len_str      = fh.readline().strip()
            self.symbols = fh.readline().strip()
        except:
            print 'Cannot read config file'
            sys.exit(1)
        brd =  re.findall('\d+', len_str)
        self.start  = int(brd[0]) # нижняя длина строки
        self.finish = int(brd[1]) # верхняя длина строки
        self.empty  = False
        if (not self.symbols) or (self.start > self.finish):
            self.empty = True
        self.len = self.start # текущая длина строки
        self.pos = 0          # текущая позиция
        self.gen = self.generator(self.start, self.finish, self.symbols)

    def generator(self, x1, x2, alfavit):
        for n in range(x1,x2+1):
            state = [0 for x in range(n)]
            memo = 0
            while memo==0:
                temp_alfavit = list(alfavit)
                res = ''
                for i in state:
                    res+=temp_alfavit[i]
                    del temp_alfavit[i]
                yield res
                memo = 1
                for i in range(n):
                    state[n-i-1] += memo
                    if state[n-i-1]==len(alfavit)-n+i+1:
                        state[n-i-1]=0
                        memo = 1
                    else:
                        memo = 0
    def isEmpty(self):
        return self.empty
    def getItem(self):
        try:
            return self.gen.next()
        except:
            self.empty = True
            return ''

q = WQueueGen('1.txt')
while not q.isEmpty():
    print q.getItem()

PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.