如何使用str创建列表列表

use*_*519 1 python list

我有一份清单

['r', 'o', 'c', 'o', 'c', 'o']` 
Run Code Online (Sandbox Code Playgroud)

并希望成功

[['r','o'], ['c', 'o'], ['c', 'o']]
Run Code Online (Sandbox Code Playgroud)

我该怎么做?此外,我需要将新列表分组为上面示例中的"n",如果n为3则n为2,结果应为:[['r','o','c'] [' O", 'C', 'O']]

aba*_*ert 7

itertools食谱有你正在寻找与任何一种迭代的,叫不正是一个通用的功能grouper:

>>> values = ['r', 'o', 'c', 'o', 'c', 'o']
>>> groups = grouper(values, 3)
Run Code Online (Sandbox Code Playgroud)

但是,这会返回一个迭代器.如果你想要一个列表,你必须明确地要求一个:

>>> groups = list(grouper(values, 3))
>>> print(groups)
[('r', 'o', 'c'), ('o', 'c', 'o')]
Run Code Online (Sandbox Code Playgroud)

另请注意,这会为您提供元组列表,而不是列表列表.这很可能对你来说并不重要.但如果确实如此,你将不得不转换它们:

>>> list_groups = [list(group) for group in grouper(values, 3)]
>>> print(list_groups)
[['r', 'o', 'c'], ['o', 'c', 'o']]
Run Code Online (Sandbox Code Playgroud)

如果你安装more_itertools了PyPI,你可以from more_itertools import grouper.否则,您必须将食谱复制并粘贴到您的代码中.

但无论哪种方式,都值得了解如何grouper运作:

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return zip_longest(fillvalue=fillvalue, *args)
Run Code Online (Sandbox Code Playgroud)

首先,它从迭代中创建一个迭代器.(这是跟踪其当前位置并在您调用next它时逐个返回值的内容,直到您到达结尾.)然后它n引用该迭代器.这是棘手的一点 - 你不希望n单独的迭代器到同一个列表,你想要n引用相同的迭代器,所以如果next从第一个迭代器中获取值,它们都会向前移动.这就是为什么它有趣的[iter(iterable)] * n一点.然后它就是zip迭代器.所以,第一个遍历第一个迭代器的zip调用next,然后是第二个,然后是第三个; 第二次通过第zip一次next迭代器再次调用,然后第二次,第三次; 等等.

它使用的原因zip_longest,而不是仅仅zip(或者,在Python 2.x中,izip_longest主场迎战izip),如此list(grouper(['r', 'o', 'c', 'o'], 3))会给你[('r', 'o', 'c'), ('o', None, None)],而不是只[('r', 'o', 'c')].如果这不是你想要的,那么只使用其他功能是微不足道的.

有关进一步说明,请参阅此博客文章.


Suk*_*lra 5

像这样的东西?

>>> a = ['r', 'o', 'c', 'o', 'c', 'o']
>>> zip(*[iter(a)]*2)
[('r', 'o'), ('c', 'o'), ('c', 'o')]

>>> zip(*[iter(a)]*3)
[('r', 'o', 'c'), ('o', 'c', 'o')]
Run Code Online (Sandbox Code Playgroud)

您可以更改为2 and 3您想要的数字.