Как перебирать буквенные и числовые числа - PullRequest
5 голосов
/ 17 марта 2012

Я хотел бы знать, как в Python я могу выполнять набор условий.

  1. строка, содержащая 2-6 нижних буквенных или цифровых символов
  2. первый символ всегда является числом

Итак, короткая прогрессия будет:

1a
1b
1c
...
1aa
1ab
1ac
...
2aaa
2aab
2aac

etc.

Ужасный пример, который может сделать первые два:

##Loop through 1a-z0-9
start = '1'
l = 97
while l < 123:
    num = start
    num += chr(l)
    print num
    l += 1

l = 48
while l < 58:
    num = start
    num += chr(l)
    print num
    l += 1

Я нашел itertools, но не могу найти хороших примеров.

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

Вы можете сделать это, используя itertools.product и itertools.chain. Сначала определите строки из цифр и букв:

numbers = '0123456789'
alnum = numbers + 'abcdefghijklmnopqrstuvwxyz'

Используя itertools.product, вы можете получить кортежи с символами для строк различной длины:

len2 = itertools.product(numbers, alnum) # length 2
len3 = itertools.product(numbers, alnum, alnum) # length 3
...

Цепочка итераторов для всех длин вместе, объединяя кортежи в строки. Я бы сделал это с пониманием списка:

[''.join(p) for p in itertools.chain(len2, len3, len4, len5, len6)]
3 голосов
/ 17 марта 2012

Я бы пошел с функцией продукта из itertools.

import itertools 
digits = '0123456789'
alphanum = 'abcdef...z' + digits # this should contain all the letters and digits

for i in xrange(1, 6):    
    for tok in itertools.product(digits, itertools.product(alphanum, repeat=i)):
        # do whatever you want with this token `tok` here.
1 голос
/ 17 марта 2012

Вы можете думать об этой проблеме в базе 26 (Игнорируя первое число, мы поместим это в отдельный случай.) Таким образом, с буквами, которые мы хотим изменить в диапазоне от 'a' до 'zzzzz' в базе 26 будет 0 и (26,26,26,26,26) = 26 ^ 0 + 26 + 26 ^ 2 + 26 ^ 3 + 26 ^ 4 + 26 ^ 5. Итак, теперь у нас есть биекция из цифр в буквы, мы просто хотим написать функцию, которая переводит нас из числа в слово

 letters = 'abcdef..z'

 def num_to_word( num ):
      res = ''
      while num:
           res += letters[num%26]
           num //= 26
      return res

Теперь, чтобы написать нашу функцию, которая перечисляет это

 def generator():
     for num in xrange(10):
         for letter_num in xrange( sum( 26 ** i for i in xrange( 6 ) ) + 1 ):
             tok = str(num) + num_to_word( letter_num )
             yield tok
0 голосов
/ 17 марта 2012

позволяет сделать это с помощью алгоритма поиска типа в ширину

starting from 
Root:
    have 10 children, i = 0,1,...,9
    so , this root must have an iterator, 'i'
    therefore this outermost loop will iterate 'i' from 0 to 9

i:
    for each 'i', there are 5 children (ix , ixx, ixxx, ixxxx, ixxxxx)
    ( number of chars at the string )
    so each i should have its own iterator 'j' representing number of chars
    the loop inside Root's loop will iterate 'j' from 1 to 5

j:
    'j' will have 'j' number of children ( 1 -> x , 2 -> xx ,..., 5-> xxxxx)
    so each j will have its own iterator 'k' representing each "character"
    so, 'k' will be iterated inside this j loop, from 1 to j
    ( i=2, j=4, k = 3 will focus on 'A' at string  "2xxAx" )

k:
    each 'k' represents a character, so it iterates from 'a' to 'z'
    each k should have a iterator(value) 'c' that iterates from 'a' to 'z' (or 97 to 122)

Я думаю, что это будет иметь смысл, чем то, что я хотел показать вам раньше. :) если вы не поняли, пожалуйста, скажите мне .. кстати, это интересный вопрос:)

...