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

Поиск:

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


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


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

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



Есть класс.
У него есть метод getItem()

Надо, чтобы при каждом вызове метода он выдавал некоторое значение.

Теперь про значение:
есть 2 числа-границы. Например 1 и 6.
Есть строка типа "abcdefghklmnopqrstuvwxyz"
Т.е. значения должны быть такие:
Код

a
b
c
d
...
y
z
aa
ab
ac
...
ay
az
ba
bb
....
zz
aaa
aab
.....
zzzzzy
zzzzzz

Вместо точек - пропуски.

Вот как такое организовать? хотел рекурсией, но тогда придется создавать список, куда добавлять эти значения, а так делать нельзя, ибо трата оперативы.


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


Опытный
**


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

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



Помучился, но получилось:
Код

def getitem(x1=1,x2=3):
    alfavit = "abcdefghklmnopqrstuvwxyz"
    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

for x in getitem(x1=1,x2=3):
    print x

PM WWW ICQ   Вверх
Artemios
Дата 14.11.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

class chr_iter_l:
  def __init__(self,max_length):
    self.max_len = max_length
    self.curr_l = [ord('a')-1]
  def __iter__(self):
        return self
  def inc_char(self,i):
    if self.curr_l[i]==ord('z'):
      self.curr_l[i] = ord('a')
      return 1
    else:
      self.curr_l[i] +=  1
      return 0
  def next(self):
    i=0
    n=len(self.curr_l)
    while i<n and self.inc_char(i):
      i+=1
    if i==n:
      if n==self.max_len:
        raise StopIteration
      else:
        self.curr_l.append(ord('a'))
    return ''.join(reversed(map(chr,self.curr_l)))

for a in chr_iter_l(2):
  print a


Только вместо 2-ки 6-кой инициализировать не советую, все-таки 36^6 строк выводить будет smile 

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


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


Новичок



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

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



Выдавать по одному из функции можно с помощью yield 
Что-то вроде return  толко при следующем вызове продолжит выполнение со следующей строки  функции (после yield) 

Код

def func(n):
    for i in range(n):
          yield i

for k in func(10000):
     print k



А алгоритм ищи в книгах по дискретной математики  (кажись эта генерация всех возможных комбинаций там должна быть) smile 
PM MAIL   Вверх
nerezus
Дата 14.11.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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



ser_gen, т.е. просто состояние переменных метода сохранится? будет ли это работать в классах?

Добавлено @ 11:47 
Artemios, спасибо, сейчас посмотрим

Добавлено @ 11:48 
albertn, спасибо.


Что у меня за плохая привычка смотреть темы снизу )


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


Опытный
**


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

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



Цитата(nerezus @  14.11.2006,  11:47 Найти цитируемый пост)
ser_gen, т.е. просто состояние переменных метода сохранится? будет ли это работать в классах?

Посмотри мой пример, там должно быть все понятно. В классах работает аналогично
PM WWW ICQ   Вверх
nerezus
Дата 14.11.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А вот такой вопрос: имеется функция-генератор(из примера albertn). Как снять с нее 1 значение?


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


Опытный
**


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

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



Цитата(nerezus @  14.11.2006,  11:58 Найти цитируемый пост)
А вот такой вопрос: имеется функция-генератор(из примера albertn). Как снять с нее 1 значение? 

Используя метод next
Код

def getitem(x1=1,x2=3):
    alfavit = "abcdefghklmnopqrstuvwxyz"
    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

z = getitem(x1=1,x2=3)
print z.next()
print z.next()

Но только по окончанию он вызывает экскепшон
PM WWW ICQ   Вверх
nerezus
Дата 14.11.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



спасибо

Добавлено @ 12:23 
получилось все.

Код

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

где 
Код

self.gen = self.generator(self.start, self.finish, self.symbols)


еще раз спасибо )


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


Шустрый
*


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

Репутация: 4
Всего: 5



мм, документацию читать не модно нынче=)
в туториале есть пример интересный, для генерации всех комбинаций, думаю переписать его не сложно

Код

#generate all combinations
##################
symbols = "123456anb"
import string
i = 0
def gen(l):
   if len(l) <= 1:
                 return [l]
   r = []
   
   for i in xrange(len(l)):
            s = l[:i] + l[i+1:]
            for x in gen[s](s):
                 r.append(l[i:i+1] + x)
   return r
combinations =  gen(symbols)
###################
f = open("passwords.txt", "w+")
print "gen..."
for cur_pass in combinations:
       f.write(cur_pass+"\n")
       i+=1
f.close()
print "generated %i passwords" %i


Это сообщение отредактировал(а) slav0nic - 14.11.2006, 12:34
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
nerezus
Дата 14.11.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



slav0nic, это откуда?  smile 


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


Шустрый
*


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

Репутация: 4
Всего: 5



nerezus, ну ген из оффициальной доки вроде бы брался) 
2.1.8 Indentation 
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
Artemios
Дата 14.11.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nerezus @  14.11.2006,  11:47 Найти цитируемый пост)
есть вариант об использовании новой системы счисления, база которой равна длине строки.

Мне тоже стало интересно, попробовал:
Код

def getitem(max_length):
  alf = map(chr,range(ord('a'),ord('z')+1))
  base = len(alf)
  max_num = base**max_length
  for i in xrange(max_num):
    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

только здесь вычислений больше производится


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


Шустрый
*


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

Репутация: 4
Всего: 5



nerezus, короче профилировщик в зубы и тести что быстрее
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
albertn
Дата 14.11.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nerezus @  14.11.2006,  11:47 Найти цитируемый пост)
есть вариант об использовании новой системы счисления, база которой равна длине строки. Вот сейчас про него думаю.
Что-то подобное у меня получилось:
Код

def convert(n,alfavit):
    start = n
    res = ''
    while 1:
        res=alfavit[start%len(alfavit)]+res
        start = start/len(alfavit)
        if start==0:
            return res

alfavit = "abcdefghklmnopqrstuvwxyz"

for x in range(100):
    print convert(x,alfavit)

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

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


 




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


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

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