如何将列表或字符串解析为固定长度的块

7

我遇到了一个基础问题,希望你能帮忙解决。我想把一个只有一项的列表分成多个长度为10的字符列表。例如给定一个只有一个项目的列表,['111111111122222222223333333333'],输出应该是:

1111111111
2222222222
3333333333

我感觉这很简单,但是我却陷入了困境。我尝试创建一个如下的函数:

def parser(nub):    
    while len(nub) > 10:  
        for subnub in nub:  
            subnub = nub[::10]
            return(subnub)  
    else:  
        print('Done')

显然,这样做是不行的。有什么建议吗?使用字符串比列表更容易吗?

你能否重新表达一下这句话:“我正在尝试将长度为n的列表迭代成包含10个字符的子列表。”我不太理解。 - mouad
@mouad编辑以提高清晰度,希望这有所帮助。 - drbunsen
修改标题的拼写错误。此外,您的字符串不需要放在列表中。另外,我之前没有回答过你的问题吗?(请参见下文) - machine yearning
4个回答

9
一个相关的问题已经被提出:将列表切片成子列表的列表 例如,如果您的源列表是:
the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]

你可以像这样拆分它:
split_list = [the_list[i:i+n] for i in range(0, len(the_list), n)]

假设 n 是你的子列表长度,那么结果将是:
[[1, 2, 3, ..., n], [n+1, n+2, n+3, ..., 2n], ...]

然后,您可以像这样迭代它:
for sub_list in split_list:
    # Do something to the sub_list

同样适用于字符串。
以下是一个实际例子:
>>> n = 2
>>> listo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)]
>>> split_list
[[1, 2], [3, 4], [5, 6], [7, 8], [9]]

>>> listo = '123456789'
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)]
>>> split_list
['12', '34', '56', '78', '9']

1

使用:

value = '111111111122222222223333333333'
n = 10
(value[i:i+n] for i in xrange(0, len(value), n))

1
尽管这个问题是在4年后发布的,但这里有另一种使用textwrap模块的方法。从文档中可以看到:

textwrap.wrap(text[, width[, ...]])

将文本(字符串)中的单个段落包装,使每行最多为width个字符。返回一个输出行的列表,不带最终换行符。

可选的关键字参数对应于下面记录的TextWrapper实例属性。width默认为70。

因此我们可以这样做:
>>> import textwrap
>>> myList = ['111111111122222222223333333333']

>>> [i for text in myList for i in textwrap.wrap(text, 10)]
['1111111111', '2222222222', '3333333333']

>>> for i in [i for text in myList for i in textwrap.wrap(text, 10)]:
...     print i
1111111111
2222222222
3333333333
>>> 

0

递归的其他实现方式:

选项1:递归函数

>>> def chunks(x, n=10):
...      if len(x) <= n:
...          return [x]
...      else:
...          return [x[:n]] + chunks(x.replace(x[:n], ''))
...
>>> seq = ['111111111122222222223333333333']
>>> print chunks(seq[0])
['1111111111', '2222222222', '3333333333']

选项2:递归lambda

>>> n = 10
>>> chunks = lambda x: [x] if len(x) <= n else [x[:n]] + chunks(x.replace(x[:n], ''))
>>> print chunks(seq[0])
['1111111111', '2222222222', '3333333333']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接