【问题标题】:Print only a certain number of characters in Python [duplicate]在Python中仅打印一定数量的字符[重复]
【发布时间】:2012-12-30 06:20:59
【问题描述】:

可能重复:
Iterate an iterator by chunks (of n) in Python?

假设我有一个 492 个字符的字符串存储在一个变量中。我怎样才能打印出前 50 个字符,然后转到下一行,然后打印出接下来的 50 个字符,最后打印出一行 42 个字符?

【问题讨论】:

  • 你尝试过什么吗?
  • @MartijnPieters:我不认为这是重复的。但我和你一样,可能使用那个来解决这个问题。

标签: python string


【解决方案1】:
chars_per_line = 50
for i in range(0, len(s), chars_per_line):
    print s[i:i+chars_per_line]

【讨论】:

  • 一件小事,但您不应该添加i+chars_per_line而不是i+50吗?
  • 是的,好点。已编辑。
  • 你不会在最后一行得到一个 IndexError,因为它只有 42 个字符吗?
  • @fizzisist 为什么不自己试试呢? (编号)
  • @frb 你是对的!无视我...
【解决方案2】:
for line in mystring.splitlines():
    print line[:50]

【讨论】:

  • 看起来 OP 有一个可能不需要包含换行符的长字符串。
  • @JoelCornett 我对“然后转到下一行”的印象是它是一个多行字符串。 @邓肯?
  • @AlexL:事实上,给定 492 个字符的输入,它会打印一堆 50 个字符的行,然后是 42 个字符的行,这表明 Joel Cornett 的猜测是正确的。否则,那 42 将是一个巨大的巧合。 (不过,OP 确认一下会很好。)
  • @abarnert 同意。你可能是对的,但我认为最好在我们知道任何一种方式之前对问题的两种解释都有答案
  • @JoelCornett 是对的。输入是一个没有换行符的字符串;它是应该有多行的输出。很抱歉造成混乱。
【解决方案3】:
In [363]: mystr = "A"*492

In [364]: print '\n'.join(mystr[i*width:(i+1)*width] for i in range(int(math.ceil(float(len(mystr))/width))))
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

【讨论】:

  • 这需要import this :-)
【解决方案4】:

正如@Martijn Pieters 暗示的那样,如果您有办法访问iterate an iterator by chunks (of n),这将非常容易。如果您阅读了该问题,您确实有办法做到这一点。

因此,鉴于 itertools recipes 中的 grouper 实现(或其他问题中您喜欢的任何其他内容):

lines = [''.join(group) for group in grouper(50, my_string, '')]

或者,如果您只想打印出来:

for group in grouper(50, my_string, ''):
    print ''.join(group)

一旦您知道 grouper 存在,我认为这比 Joel Cornett 的回答要简单。请注意,他在第一个版本中不起作用,必须修复;这几乎是不可能出错的。任何消除栅栏错误可能性的方法通常都更好;这就是为什么我们有for-in 循环和enumerate 而不是C 风格的for 循环等等。

它在行动:

>>> my_string='1234567890'*49+'12'
>>> print my_string
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
>>> # That was ugly…
>>> for group in grouper(50, my_string, ''):
...     print ''.join(group)
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012
>>> # Pretty!

【讨论】:

  • 我现在看到了。只是我有限的新手词典不包含“迭代迭代器”之类的东西;-)
  • @DuncanWadsworth:是的,如果您还不知道要弄清楚什么,这个术语有点难以理解。但是这个概念很简单,一旦你得到它:你有一个包含 492 个字符的字符串,你想一次将它们分组 50 个。字符串只是一种可迭代对象,因此对可迭代对象进行分组的一般方法将为您提供对字符串进行分组的方法。一切都很简单——除非你还不知道通用的可迭代概念,否则你甚至都不会想到要寻求这样一个通用的解决方案,更不用说自己找到它了。
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2018-05-09
  • 2014-06-14
  • 2018-11-19
  • 2020-04-28
  • 2013-08-12
相关资源
最近更新 更多