2015-05-09 2 views
2

Я пытаюсь понять одну строку for-loops и поместить ее в обычную номенклатуру для вложенных for-loops. Один вкладыш для петель следующим образом:Понимание python вложенной одной строки для циклов

print ''.join((letter[i - 1]for i in (int(n) for n in key.split()))) 

я написал выше вложенный для петель обычного способа следующим образом:

for n in key.split(): 
    n = int(n) 
    for i in n: 
     print ''.join(letter[i - 1]) 

Я не получаю желаемый результат. Пожалуйста, кто-нибудь может объяснить, где мое мышление идет не так, или как могут быть написаны обычные однострочные петли. Заранее спасибо.

+3

Те * списочные *, а не "петля". Поиск ключевого слова обеспечит много чтения о том, как они работают. – user2864740

+1

Что вы пытаетесь сделать с 'for i in n', где' n' является 'int'? Объект 'int' не является итерабельным. – ashwinjv

+2

Это выражения генератора, а не списки. – cababunga

ответ

3

Посмотрите внимательно на круглых скобках в вашем однострочнике:

print ''.join((letter[i - 1]for i in (int(n) for n in key.split()))) 
            ^---------------------------^ 

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

print ''.join((letter[int(i) - 1]for i in (n for n in key.split()))) 

или просто

print ''.join(letter[int(i) - 1] for i in key.split()) 

Эквивалентной петля будет

for i in key.split(): 
    print letter[int(i) - 1], # Suppress the newline 
+0

Спасибо @ chepner..Но каждый раз, когда я печатаю с вашей линией, я получаю пробел после каждого письма. Как я могу удалить это? Благодарю. – deep

+0

Ух, это хороший вопрос. Я не помню, есть ли способ с выражением print * *; либо добавьте 'из __future__ import print_function' в начало вашего скрипта, чтобы вы могли использовать' print (letter [int (i) - 1], end = '') 'или использовать версию, которая использует'. '.join' используйте 'print' только один раз. – chepner

Смежные вопросы