在单独的行中连续打印5个项目以获取列表?

时间:2015-05-26 06:42:03

标签: python

我有一个未知数量的项目列表,比方说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

11 个答案:

答案 0 :(得分:14)

你可以通过列表理解来简单地做到这一点:"\n".join(["".join(lst[i:i+5]) for i in xrange(0,len(lst),5)])这里的xrange(start, end, interval)会给出一个在5距离上等距的整数列表,然后我们对给定的列表进行切片通过list slicing使用长度为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

答案 1 :(得分:13)

for i, a in enumerate(A):
    print a, 
    if i % 5 == 4: 
        print "\n"

另一种选择,打印后的逗号表示没有换行符

答案 2 :(得分:8)

需要调用for-loopjoin函数才能解决它。

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

答案 3 :(得分:6)

这里有很多答案说你怎么做,但没有人解释如何解决这个问题。我想用来计算循环的技巧是手工编写前几次迭代,然后寻找一个模式。另外,首先忽略边缘情况。在这里,明显的边缘情况是:如果列表的大小不是5的倍数怎么办?别担心!我将尝试避免使用任何花哨的语言功能,这将使我们在这个答案中更容易,而是手动完成所有事情,艰难的方式。这样我们就可以专注于基本思想,而不是酷炫的Python功能。 (Python有许多很酷的功能。我老实说不确定我是否能够抵抗它们,但我会尝试。)我将使用print语句而不是thefile.write,因为我觉得它更容易阅读。您甚至可以使用print语句写入文件: 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。对于这个问题,这是一个好主意,你也可以使用它。麻烦的是,如果你有不同的问题,它将无济于事。即使Python没有预先解决的解决方案,DIY方法仍然有效:)

答案 4 :(得分:4)

这将有效:

n = m = 0
while m < len(l):
    m = m+5
    print("".join(l[n:m]))
    n = m

但我相信有更多的pythonic方式可以完成任务。

答案 5 :(得分:4)

你可以像下面这样更容易,将你的列表分成子列表,这似乎更像Pythonic。然后打印它你想要的。 也不要使用列表,因为它是关键字(不推荐)

sub_list1=[list1[x:x+5] for x in xrange(0, len(list1), 5)]
for each in sub_list1:
    print( ''.join(each))

答案 6 :(得分:3)

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

答案 7 :(得分:2)

只是为了证明我真的是一个未经改造的JAPH正则表达式是要走的路!

import re
q="".join(lst)
for x in re.finditer('.{,5}',q)
  print x.group()

答案 8 :(得分:1)

如果您正在处理一个可能太大而无法容纳在RAM中的可迭代(如文件),您可以使用以下内容:

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,answer by ZdaR更可取,因为速度要快得多。

答案 9 :(得分:1)

我认为最简洁的书写方式是

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='')

答案 10 :(得分:0)

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')