Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法断开有限大小的列表_Python_Python 2.7 - Fatal编程技术网

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
,它将隐藏内置名称。顺便说一句,你的答案不是已经出现在答案中了吗?其他答案没有任何解释,但很有意义。你知道为什么会投反对票吗?