2014-01-04 4 views
2

В настоящее время я работаю над программой. Я бы хотел, чтобы он увеличивал число символов в 5 символов. (Извините, если приращение не является правильным словом.)Как увеличить число буквенных значений

Так что я хотел бы, чтобы программа начала с 55aa0 и заканчивалась на 99zz9. Причина, по которой я хочу, чтобы она начиналась с 55aa0, а не 00aa0, состоит в том, что для того, что я делаю, это будет пустой тратой времени.

Я также хотел бы присвоить это значение переменной и добавить ее на нее в конец другой переменной и вызвать этот URL-адрес.

Так, например, URL-адрес может быть: domain.de/69xh2

Если вам нужно больше информации, я с удовольствием добавлю его.

count = 0 
while count <= n: 
    url = "" 
    if url.endswith(".jpg"): 
     fileType = ".jpg" 
    elif url.endswith(".png"): 
     fileType = ".png" 

    if os.path.isfile("images/" + fileName): 
     pass 
    else: 
     urllib.urlretrieve(url, "images/" + count + fileType) 
     count = count + 1 
+0

Можете ли вы сказать, что правильная последовательность будет выглядеть? Это были бы, например, '['55aa0', '55aa1', '55aa2', '55aa3', '55aa4', '55aa5', '55aa6', '55aa7', '55aa8', '55aa9', '55ab0 '...] '? – Simon

+0

['55aa0', '55aa1', ... '55aa9', '55ab0', ... '55az9', '55ba0', ... '55zz9', '56aa0', ... '59zz9', ' '60aa0'] –

ответ

0

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

letters = ["a","b"..."y","z"] 
    var firstNum = 55 
    var firstLetter = letters[0] 
    var secondLetter = letters[0] 
    var scondNum = 0 

затем сделать петлю, что приращения, что вы хотите, и конкатенации. Например, если вы хотите увеличить последний номер первым:

varList = [] 
for i in range(0, 100): 
    varList.append(firstNum + firstLetter + secondLetter + (secondNum + i)) 

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

надежды, что помогает!

2

Это звучит как работа для itertools:

from itertools import dropwhile, islice, product 

from string import digits, ascii_lowercase as letters 

def values(): 
    """Yield strings in format '00aa0', starting with '55aa0'.""" 
    def pred(t): 
     """Return False once second digit in tuple t reaches '5'.""" 
     return t[1] < '5' 
    for t in dropwhile(pred, product(digits[5:], digits, letters, 
            letters, digits)): 
     yield "".join(t) 

Это начинается с (с использованием list(islice(values(), 0, 21)) на предложение Саймона):

['55aa0', '55aa1', '55aa2', '55aa3', '55aa4', '55aa5', 
'55aa6', '55aa7', '55aa8', '55aa9', '55ab0', '55ab1', 
'55ab2', '55ab3', '55ab4', '55ab5', '55ab6', '55ab7', 
'55ab8', '55ab9', '55ac0'] 

Преимущество использования itertools этого заключается в том, что вы не необходимо собрать весь список (304,200 элементов) в памяти, но может перебирать его:

for s in values(): 
    # use s 

Обратите внимание, что эта версия довольно тесно связана с вашими требованиями (наконечник шляпы для Krab для повышения эффективности), но его можно легко изменить для более общего использования.

Еще более быстрая версия, опять-таки с предложением КРАБ по:

def values(): 
    """Yield strings in format '00aa0', starting with '55aa0'.""" 
    for t in product(map(str, range(55, 100)), letters, letters, digits): 
     yield "".join(t) 

Примечание: используйте xrange и itertools.imap в Python 2.x.

+0

+1: Элегантное решение. И, чтобы распечатать список, можно использовать еще больше удобства itertools, например. 'print (list (itertools.islice (values ​​(), 0, 100)))' ... для печати первой сотни позиций (см. [здесь] (http://stackoverflow.com/questions/5234090/how-to -Take-топ-N-пунктов-с-а-генератор-или-лист-в-Python)). – Simon

+1

Было бы более эффективно фильтровать до перечисления продукта, это означает, что вместо первых двух слов «цифры» следует использовать что-то вроде «цифр» [5:] ' – Krab

+0

. Второе использование цифр должно включать 0-4, когда первая цифра, например, 6, но может быть применен к первому – jonrsharpe

0

Я использовал базовый алгоритм добавления двух целых чисел по цифре справа налево.

def get_next(st): 
    next_str = "" 
    increment = '0'*(len(st)-1) + '1' 
    index = len(st) -1 
    carry = 0 
    curr_digit = 0 
    while(index>=0): 
     if (st[index].isalpha()): 

      curr_digit = (ord(st[index]) + int(increment[index]) + carry) 
      if curr_digit > ord('z'): 
       curr_digit -= ord('a') 
       curr_digit %= 26 
       curr_digit += ord('a') 
       carry = 1 
      else: 
       carry = 0 
      curr_digit = chr(curr_digit) 
      next_str += curr_digit 

     elif (st[index].isdigit()): 
      curr_digit = int(st[index]) + int(increment[index]) + carry 
      if curr_digit > 9: 
       curr_digit %= 10 
       carry = 1 
      else: 
       carry = 0 
      next_str += str(curr_digit) 
     index -= 1 
    return next_str[::-1] 

counter = 20 

next_str = '55aa0' 
while(counter > 0): 
    next_str = get_next(next_str) 
    print next_str 
    counter -= 1 

Выход:

55aa1 
55aa2 
55aa3 
55aa4 
55aa5 
55aa6 
55aa7 
55aa8 
55aa9 
55ab0 
55ab1 
55ab2 
55ab3 
55ab4 
55ab5 
55ab6 
55ab7 
55ab8 
55ab9 
55ac0 
Смежные вопросы