我真的陷入了一个基本问题。我试图获取一个项目的列表,并将其分成许多项目的列表,每个项目的字符长度为10.例如,给出一个列表,其中包含一个项目['111111111122222222223333333333']
,输出将生成:
1111111111
2222222222
3333333333
我觉得这很简单,但我很难过。我试图创建一个这样的函数:
def parser(nub):
while len(nub) > 10:
for subnub in nub:
subnub = nub[::10]
return(subnub)
else:
print('Done')
显然,这不起作用。有什么建议?使用字符串比列表更容易吗?
答案 0 :(得分:9)
有人问过一个相关的问题: Slicing a list into a list of sub-lists
例如,如果您的源列表是:
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 :(得分:1)
使用:
value = '111111111122222222223333333333'
n = 10
(value[i:i+n] for i in xrange(0, len(value), n))
答案 2 :(得分:1)
虽然这个问题已在4年后发布,但这是另一种方法,使用textwrap
module。来自文件:
textwrap.wrap(text[, 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
>>>
答案 3 :(得分: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']