2013-03-05 1 views
2

Я изучал Python и играл с Project Euler, чтобы восстановить некоторые из моих математических навыков. Я столкнулся с проблемой с Problem 35. Я создал все Primes менее 1 миллиона, исключил те, которые содержат любые четные числа, и теперь я просто пытаюсь запустить последнюю проверку с остальными ~ 3k простых чисел.Python: «For'loop работает только один раз, Project Euler

Эта функция должна:

  1. Возьмите список ~ 3k простых чисел.
  2. Верните новый список, состоящий из списков всех поворотов для каждого элемента в исходном списке.

Вот что у меня есть, с тем, как я понимаю каждую строку:

def rotations(lst): 
    newlist = [] 
    for i in lst:            # Take each int item in list. 
     s = [int(j) for j in str(i)]       # Turn each item into a list of digit strings 
     num = ([s[k:]+s[:-len(s)+k] for k in range(len(s))]) # Generate list of rotations of strings 
     tmplst = [] 
     for l in num:           # For each string rotation 
      tmplst.append(int(''.join(map(str,l))))   # Turn it into an integer, add that int to tmplst 
     newlist.append(tmplst)         # Add each tmplist to 'newlist' 
    return newlist 

вводящих rotations([123,456]) только выходы:

[[123, 231, 312]] 

Когда я ожидал

[[123, 231, 312],[456,564,645]] 

Любой подсказывает, что может пойти не так?

+3

Не удается воспроизвести, получил '[[123, 231, 312], [456, 564, 645]]'. –

ответ

8

Всякий раз, когда у кого-то есть код, который другие люди (включая меня) не могут воспроизвести странное поведение, я сразу же думаю: пробельная ошибка. И, глядя на ваш код:

' def rotations(lst):' 
'   newlist = []' 
'   for i in lst:            # Take each int item in list. ' 
'   \t s = [int(j) for j in str(i)]       # Turn each item into a list of digit strings' 
'   \t num = ([s[k:]+s[:-len(s)+k] for k in range(len(s))]) # Generate list of rotations of strings ' 
'   \t tmplst = [] ' 
'   \t for l in num:           # For each string rotation' 
"    \t  tmplst.append(int(''.join(map(str,l))))   # Turn it into an integer, add that int to tmplst" 
"    \t newlist.append(tmplst)         # Add each tmplist to 'newlist'" 
'     return newlist' 
'  ' 

Мне кажется, что вы можете смешивать вкладки и пробелы. Это может привести к таинственному поведению, поскольку определенные строки не отступаются так сильно, как вы думаете. Запустите программу с

python -tt your_program_name.py 

для подтверждения, и если да, то переход к использованию четыре-пространства отступа (я имею в виду «язычки», которые состоят из четырех пространств, а не \t.)

+3

Или пробелы-только. PEP 8 рекомендует использовать только пробелы (и я тоже)! –

+0

@MartijnPieters: да, я тоже. Я уточнил, что я имею в виду под «четырехпозиционными вкладками». – DSM

+0

Они называются «четырьмя отступами пространства»; 'tabs' - это символ табуляции, который можно использовать не только для отступов. :-) Отступы! = Вкладки, вкладки! = Отступы. –

1

пробельной ошибки упомянутый в предыдущем ответе, отвечает за непосредственную проблему - возвращает результат в конце первого прохода for i in lst:, а не после завершения цикла - но также имеет смысл упростить код, поэтому его меньше, а ошибки проще заметить. Вот пример (функция переименована из rotations в rotor для отличия).

def rotor(lst): 
    out = [] 
    for i in lst: 
     s = str(i) 
     out.append([int(s[k:]+s[:k]) for k in range(len(s))]) 
    return out 

Учитывая вышеизложенное, rotor([456, 1789, 25887]) возвращает

[[456, 564, 645], 
[1789, 7891, 8917, 9178], 
[25887, 58872, 88725, 87258, 72588]] 
+0

Это гораздо читательнее, чем у меня. Я достаточно новый для всего мира Python, так что обычно я могу получить программу, но она, как правило, довольно уродливая. Спасибо за чистый код. – MDd