Печать 5 элементов в строке по отдельным строкам для списка?
У меня есть список неизвестного количества элементов, скажем 26.
скажем,
list=['a','b','c','d','e','f','g','h',
'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
Как напечатать так:
abcde
fghij
klmno
pqrst
uvwxy
z
?
Большое спасибо.
Попытка:
start = 0
for item in list:
if start < 5:
thefile.write("%s" % item)
start = start + 5
else:
thefile.write("%s" % item)
start = 0
Ответы
Ответ 1
Ему нужно вызвать функции for-loop
и join
, которые могут его решить.
l=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
for i in range(len(l)/5+1):
print "".join(l[i*5:(i+1)*5]) + "\n"
Демо:
abcde
fghij
klmno
pqrst
uvwxy
z
Ответ 2
Вы можете сделать это по понятию списка: "\n".join(["".join(lst[i:i+5]) for i in xrange(0,len(lst),5)])
xrange(start, end, interval)
здесь даст список целых чисел, которые равномерно распределены на расстоянии 5
, то мы перечислим данный список в маленькие куски, каждая из которых имеет длину 5, используя сортировку списка.
Затем метод .join()
делает то, что предлагает название, он объединяет элементы списка, помещая данный символ и возвращает строку.
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
print "\n".join(["".join(lst[i:i+5]) for i in xrange(0,len(lst),5)])
>>> abcde
fghij
klmno
pqrst
uvwxy
z
Ответ 3
for i, a in enumerate(A):
print a,
if i % 5 == 4:
print "\n"
Другой альтернативой, запятая после печати означает, что символ новой строки отсутствует
Ответ 4
Здесь много ответов, рассказывающих вам, как это сделать, но никто не объясняет, как это понять. Трюк, который мне нравится использовать для вычисления цикла, заключается в том, чтобы написать первые несколько итераций вручную, а затем искать шаблон. Кроме того, сначала игнорируйте краевые случаи. Здесь очевидный краевой случай: что, если размер списка не кратен 5? Не беспокойтесь об этом! Я попытаюсь избежать использования каких-либо причудливых языковых функций, которые облегчили бы нам в этом ответе, и вместо этого сделают все вручную, трудным путем. Таким образом, мы можем сосредоточиться на базовой идее, а не на интересных функциях Python. (У Python много интересных функций. Я честно не уверен, могу ли я сопротивляться им, но я попробую.) Я буду использовать инструкции печати вместо thefile.write
, потому что мне кажется, что это легче читать. Вы даже можете использовать операторы печати для записи в файлы:
print >> thefile, l[0]
, и не нужно для всех этих строк %s
:) Здесь версия 0:
print l[0], l[1], l[2], l[3], l[4]
print l[5], l[6], l[7], l[8], l[9]
Этот цикл достаточно прост, что, возможно, достаточно двух итераций, но иногда вам может понадобиться больше. Здесь версия 1 (обратите внимание, что мы все еще предполагаем, что размер списка кратен 5):
idx=0
while idx < len(l):
print l[idx], l[idx+1], l[idx+2], l[idx+3], l[idx+4]
a += 5
Наконец, мы готовы позаботиться о том, что большинство номеров не кратно 5. Приведенный выше код будет в основном аварийным в этом случае. Попробуем исправить это, не задумываясь слишком сильно. Есть несколько способов сделать это; это та, с которой я столкнулся; вам рекомендуется попытаться придумать свои собственные, прежде чем заглянуть в то, что я сделал. (Или после просмотра, если вы предпочитаете.) Версия 2:
idx=0
while idx < len(l):
print l[index],
if idx+1 < len(l): print l[idx+1],
if idx+2 < len(l): print l[idx+2],
if idx+3 < len(l): print l[idx+3],
if idx+4 < len(l): print l[idx+4]
idx += 5
Наконец-то у нас есть код, который делает то, что мы хотим, но это не очень. Это так повторяемо, что я прибегал к копированию/вставке, чтобы написать его, и это тоже не очень симметрично. Но мы знаем, что делать с повторяющимся кодом: используйте цикл! Версия 3:
idx=0
while idx < len(l):
b = 0
while b < 5:
if idx+b < len(l): print l[idx+b],
b += 1
print
idx += 5
Он больше не повторяется, но он не стал короче. Это может быть хорошее время, чтобы посмотреть на наш код и посмотреть, отражает ли оно лучшее решение, или просто отражает путь, который мы взяли, чтобы добраться сюда. Может быть, есть более простой способ. Действительно, почему мы обрабатываем вещи в блоках по пять? Как насчет того, чтобы мы шли по одному, но особенно каждый пятый предмет. Пусть начнется. Версия 4:
idx=0
while idx < len(l):
print l[idx],
if idx % 5 == 4: print
idx += 1
Теперь это намного красивее! На этом этапе мы много работали и вознаграждали себя, глядя на то, что классные функции Python должны сделать этот код еще приятнее. И мы находим, что ответ dabhand - это почти то, что у нас есть, за исключением того, что он использует enumerate
, поэтому Python выполняет работу по отслеживанию того, на каком количестве мы находимся. Это только спасает нас двумя строками, но с такой короткой петлей, она почти сокращает наш счетчик строк наполовину:) Версия 5:
for idx, item in enumerate(l):
print item,
if idx % 5 == 4: print
И это моя окончательная версия. Многие люди предлагают использовать join
. Это хорошая идея для этой проблемы, и вы можете ее использовать. Беда в том, что это не помогло бы, если бы у вас была другая проблема. Подход DIY работает даже тогда, когда у Python нет предварительно приготовленного решения:)
Ответ 5
Это будет работать:
n = m = 0
while m < len(l):
m = m+5
print("".join(l[n:m]))
n = m
Но я считаю, что существует более питонический способ выполнить задачу.
Ответ 6
Вы можете сделать что-то более легкое, как показано ниже, разбить список на суб-список, также это кажется более Pythonic. Затем распечатайте его, как захотите.
Также не используйте список как ключевое слово (не рекомендуется)
sub_list1=[list1[x:x+5] for x in xrange(0, len(list1), 5)]
for each in sub_list1:
print( ''.join(each))
Ответ 7
start = 0
for item in list:
if start < 4:
thefile.write("%s" % item)
start = start + 1
else: #once the program wrote 4 items, write the 5th item and two linebreaks
thefile.write("%s\n\n" % item)
start = 0
Ответ 8
Просто, чтобы доказать, что я действительно нереформированный JAPH регулярные выражения - это путь!
import re
q="".join(lst)
for x in re.finditer('.{,5}',q)
print x.group()
Ответ 9
Если вы работаете над итерируемым (например, файлом), который потенциально слишком велик для размещения в ОЗУ, вы можете использовать что-то вроде этого:
from itertools import izip_longest
def chunker(iterable, n, fillvalue=None):
"""Like an itertools.grouper but None values are excluded.
>>> list(chunker([1, 2, 3, 4, 5], 3))
[[1, 2, 3], [4, 5]]
"""
if n < 1:
raise ValueError("can't chunk by n=%d" % n)
args = [iter(iterable)] * n
return (
[e for e in t if e is not None]
for t in izip_longest(*args, fillvalue=fillvalue)
)
with open('some_file') as f:
for row in chunker(f, 5):
print "".join(row)
Если RAM не является соображением, ответ ZdaR предпочтительнее, поскольку он значительно быстрее.
Ответ 10
Я думаю, что самый чистый способ написать это было бы
list=['a','b','c','d','e','f','g','h', 'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
for i in range(0, len(list), 5):
print(*list[i:i+5], sep='')
Ответ 11
Python 3+ простой способ
lst=['a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z']
for ind, smb in enumerate(lst):
print(smb, end='')
if ind%5 == 4:
print('\n')