python – 创建子列表

列表相反的展平.

给定列表和长度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的“Python 3编程”)他们是一样的?

谢谢.

这样的列表可以使用list comprehension

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 idiom

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. izip_longest也可以使用fillvalue参数,如果需要除None以外的其他参数.

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
http://stackoverflow.com/questions/4501636/creating-sublists

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – 创建子列表