【问题标题】:Iterating Over a String in Threes三分之二地迭代一个字符串
【发布时间】:2016-02-12 01:44:44
【问题描述】:

假设我有字符串:

string = 'ABCDEFGHI'

我想遍历字符串,所以输出将是:

ABC
DEF
GHI

这可行吗?我可以按照以下方式做一些事情:

for i in string, 3:
  print i

我觉得我缺少一个更简单的解决方案。

【问题讨论】:

  • 长度能被3整除吗?你想如何处理字符串为'ABCDEFGHIJK'的情况?
  • 我有一个方法可以确保字符串可以被 3 整除。

标签: python python-2.7 loops for-loop iteration


【解决方案1】:

一个简单的for 循环来完成此操作:

for i in range(3, len(string) + 1, 3): 
    print string[i-3:i]

它使用range()step=3 值通过3's 进行迭代,然后使用取决于i 值的slice 对象,您将得到结果切片字符串。对于string = 'ABCDEFGHI',打印:

ABC
DEF
GHI

当然,您可以使用变量删除硬编码的3,例如gap = 3,以使循环更美观:

gap = 3
for i in range(gap, len(string) + 1, gap): 
    print string[i-gap: i] 

【讨论】:

  • 为什么从gap 开始而不是0print string[i:i+gap]? -- 这似乎是我所期望的多一点...
  • 这实际上会使计数器超过len(string)+1 限制并用string[9:12] 索引string(在这种情况下)。当然,将 stop 更改为 len(string) - 1 可以解决问题,但是,至少对我而言,它似乎不太直观。
【解决方案2】:

你可以像这样创建一个生成器函数:

def trios(seq):
    result = []
    for e in seq:
        result.append(e)
        if len(result) == 3:
            yield result
            result = []
    if result:
        yield result

然后像这样使用它:

>>> string = "ABCDEFGHIJ"
>>> [t for t in trios(string)]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']]

如果字符串不能被三整除,则最终元素将包含少于三个字符。如果你宁愿把它们扔掉,你可以这样写生成器:

def trios(seq):
    result = []
    for e in seq:
        result.append(e)
        if len(result) == 3:
            yield result
            result = []

【讨论】:

    【解决方案3】:

    查看grouper recipe on the itertools 文档。正如所写,它返回tuples,而不是新的strs,但它的适应性很简单:

    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
        args = [iter(iterable)] * n
        return izip_longest(*args, fillvalue=fillvalue)
    

    唯一的调整是包装最后一行,使其将tuples zip_longest 生成回str

        return map(''.join, izip_longest(*args, fillvalue=fillvalue))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多