how to parse a list or string into chunks of fixed length
我真的陷在一个基本问题上了。我试图取一个项目的列表,并将其分为多个项目的列表,每个项目的字符长度为10。例如,给出一个包含一个项目的列表,
1 2 3 | 1111111111 2222222222 3333333333 |
我觉得这很简单,但我被难住了。我试图创建这样的函数:
1 2 3 4 5 6 7 | def parser(nub): while len(nub) > 10: for subnub in nub: subnub = nub[::10] return(subnub) else: print('Done') |
显然,这行不通。有什么建议吗?使用字符串比使用列表容易吗?
已询问相关问题:将列表切片为子列表列表
例如,如果源列表是:
1 | the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ] |
您可以将其拆分为:
1 | split_list = [the_list[i:i+n] for i in range(0, len(the_list), n)] |
假设n是子列表的长度,结果是:
1 | [[1, 2, 3, ..., n], [n+1, n+2, n+3, ..., 2n], ...] |
然后您可以像这样迭代它:
1 2 | for sub_list in split_list: # Do something to the sub_list |
弦也是这样。
下面是一个实际的例子:
1 2 3 4 5 6 7 8 9 10 | >>> 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'] |
虽然这个问题已经发布4年了,但这里有另一种方法可以做到这一点:使用
textwrap.wrap(text[, width[, ...]]) Wraps the single paragraph in text (a string) so every line is at most width characters long. Returns a list of output lines, without final newlines.
Optional keyword arguments correspond to the instance attributes of TextWrapper, documented below. width defaults to 70.
所以我们可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 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 >>> |
用途:
1 2 3 | value = '111111111122222222223333333333' n = 10 (value[i:i+n] for i in xrange(0, len(value), n)) |
其他递归方式:
选项1:递归函数
1 2 3 4 5 6 7 8 9 | >>> 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
1 2 3 4 | >>> 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'] |