Python 无法断开有限大小的列表
我有一个字母列表:Python 无法断开有限大小的列表,python,python-2.7,Python,Python 2.7,我有一个字母列表: list1 = [abcdefghijk] 我有num=3,想把list1分成3部分,即: [[abc], [def], [ghi], [jk]] 我的代码是: for i in range(0, len(list1), num): chunks = [list1[i:i+num]] 我得到了错误的输出: chunks = ['k'] 但我希望: chunks = [[abc],[def],[ghi],[jk]] 我已经在这里介绍了所有可用的解决方案。但他们
list1 = [abcdefghijk]
我有num=3
,想把list1
分成3部分,即:
[[abc], [def], [ghi], [jk]]
我的代码是:
for i in range(0, len(list1), num):
chunks = [list1[i:i+num]]
我得到了错误的输出:
chunks = ['k']
但我希望:
chunks = [[abc],[def],[ghi],[jk]]
我已经在这里介绍了所有可用的解决方案。但他们没有帮助。我应该如何解决这个问题?首先,由于字符串是一个可数,因此不需要将其放入列表中,如果是这样,则可以将其取出并取出变量中的字符串,并使用python grouper函数将字符串从中分组为块,然后使用列表理解将它们连接起来:
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
num = 3
chunks = []
for i in range(0,len(list1), num):
chunks.append([list1[i:i+num]])
print chunks
from itertools import izip_longest
def grouper(iterable, n, fillvalue=''):
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
[''.join(i) for i in grouper(list1,3)]
产生
['abc', 'def', 'ghi', 'jk']
['abc', 'def', 'ghi', 'jk']
注意:对于python 3,使用zip\u longest
>>> list2 = 'abcdefghijk'
>>> [list2[i:i+num] for i in range(0, len(list2), num)]
['abc', 'def', 'ghi', 'jk']
工作原理
i:i+num
是一个切片:它选择从索引i
开始,一直到但不包括索引i+num
。例如:
>>> list2[6 : 6+3]
'ghi'
我们希望每三个字符执行一次切片。要获得我们需要的i
值,我们使用范围
函数:
>>> range(0, len(list2), num)
[0, 3, 6, 9]
现在,我们想在range
提供的每个索引处对列表进行切片。因此:
>>> [ list2[i:i+num] for i in range(0, len(list2), num) ]
['abc', 'def', 'ghi', 'jk']
这种形式称为列表理解。另一种解决方案,没有索引,只有一次通过
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
num = 3
chunks = []
chunk = ''
for pos, el in enumerate(list1, 1):
chunk += el
if not pos % num:
chunks.append(chunk)
chunk = ''
chunks.append(chunk)
print chunks
产生
['abc', 'def', 'ghi', 'jk']
['abc', 'def', 'ghi', 'jk']
在循环的每次迭代中,您都会覆盖存储在变量
chunks
中的值。因此,您的解决方案不起作用,可以通过以下方式调整代码来解决此问题:
list1 = 'abcdefghijk'
chunks = []
for i in range(0, len(list1), num):
chunks.append( list1[i:i+num] )
解决您的问题的一种更具python风格的方法是以下一行:
[list1[i:i+num] for i in range(0, len(list1), num)]
这被称为。当您调用grouper并离开
fillvalue=fillvalue
@padraickenningham时,您可能应该传递fillvalue
,谢谢;-)重复使用同一个迭代器是纯粹的天才。今天我学到了一些东西。非常感谢。你应该在引号中加上字母,否则它在python中不是一个合法的结构。请避免命名列表list
,它将隐藏内置名称。顺便说一句,你的答案不是已经出现在答案中了吗?其他答案没有任何解释,但很有意义。你知道为什么会投反对票吗?