创建子列表

5 浏览
0 Comments

创建子列表

这个问题已经有答案了

如何将列表分割成相等大小的块?

反向列表展平。

给定一个列表和一个长度n,返回长度为n的子列表的列表。

def sublist(lst, n):
    sub=[] ; result=[]
    for i in lst:
        sub+=[i]
        if len(sub)==n: result+=[sub] ; sub=[]
    if sub: result+=[sub]
    return result

一个例子:

如果列表是:

[1,2,3,4,5,6,7,8]

并且n是:

3

返回:

[[1, 2, 3], [4, 5, 6], [7, 8]]

是否有更简洁/简洁的方法?

顺带说一下,在将列表附加到列表中时,何种方式更受欢迎(在上下文中):

list1+=[list2]

还是:

list1.append(list2)

鉴于(根据Summerfeild的《Programming in Python 3》)它们是相同的?

谢谢。

admin 更改状态以发布 2023年5月20日
0
0 Comments

以下几种方式如何(其中x是您的列表):

 [x[i:i+3] for i in range(0, len(x), 3)]

对于n!=3,此任务很简单。

至于您的第二个问题,它们是等效的,所以我认为这是一个风格问题。但是,请确保您不会混淆appendextend

0
0 Comments

可以使用列表推导来构建这样的嵌套列表:

In [17]: seq=[1,2,3,4,5,6,7,8]
In [18]: [seq[i:i+3] for i in range(0,len(seq),3)]
Out[18]: [[1, 2, 3], [4, 5, 6], [7, 8]]

还有grouper习惯用法

In [19]: import itertools
In [20]: list(itertools.izip_longest(*[iter(seq)]*3))
Out[20]: [(1, 2, 3), (4, 5, 6), (7, 8, None)]

但是要注意,缺失的元素会用None填充。如果需要其他值而不是None,izip_longest也可以接受fillvalue参数。


list1+=[list2] —— 注意这次有方括号 —— 等同于 list1.append(list2)。我写代码时的最高优先级是可读性,而不是速度。因此,我会选择list1.append(list2)。然而,可读性是主观的,可能会受到您熟悉的习惯用法的影响。

令人欣慰的是,在这种情况下,可读性和速度似乎是一致的:

In [41]: %timeit list1=[1,2,3]; list1.append(list2)
1000000 loops, best of 3: 612 ns per loop
In [42]: %timeit list1=[1,2,3]; list1+=[list2]
1000000 loops, best of 3: 847 ns per loop

0