使用步长python对列表中的项进行分组?

2024-04-23 20:48:03 发布

您现在位置:Python中文网/ 问答频道 /正文

给出一个输入列表

 l = [1 2 3 4 5 6 7 8 9 10]

和组大小grp和步长

^{pr2}$

我想退一份单子。注意结尾处的重复

1 2 3
3 4 5
5 6 7
7 8 9
9 10 1

或者如果

grp= 4; step = 2

输出应该是

1 2 3 4
3 4 5 6
5 6 7 8
7 8 9 10

这是我想出的代码,它不做循环的事情。 但是想知道有没有更小的或者更简单的解决方案

def grouplist(l,grp,step):
    oplist = list()
    for x in range(0,len(l)):
        if (x+grp<len(l)):
        oplist.append(str(l[x:x+grp]))
    return oplist

Tags: 代码列表lendefstep解决方案事情list
3条回答
def grouplist(L, grp, step):
    starts = range(0, len(L), step)
    stops = [x + grp for x in starts]
    groups = [(L*2)[start:stop] for start, stop in zip(starts, stops)]
    return groups

def tabulate(groups):
    print '\n'.join(' '.join(map(str, row)) for row in groups)
    print

输出示例:

^{pr2}$

您可以利用xrange或range中的step函数,具体取决于您使用的python版本。然后按列表的长度进行修改

import sys

def grouplist(l,grp,step):
    newlist=[]
    d = len(l)
    for i in xrange(0,len(l),step):
        for j in xrange(grp):
            newlist.append(l[(i+j)%d])
            sys.stdout.write(str(l[(i+j)%d]) + ' ')
        print

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print grouplist(l,3,2)
1 2 3 
3 4 5 
5 6 7 
7 8 9 
9 10 1 
[1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 1]

print grouplist(l,4,2)
1 2 3 4 
3 4 5 6 
5 6 7 8 
7 8 9 10 
9 10 1 2
[1, 2, 3, 4, 3, 4, 5, 6, 5, 6, 7, 8, 7, 8, 9, 10, 9, 10, 1, 2] 

使用deque:

from itertools import islice
from collections import deque



def grps(l, gps, stp):
    d = deque(l)
    for i in range(0, len(l), stp):
        yield list(islice(d, gps))
        d.rotate(-stp)

输出:

^{pr2}$

您还可以加入yield the islice对象,并决定要在外部对其执行什么操作:

def grps(l, gps, stp):
    d =  deque(l)
    for i in range(0, len(l), stp):
        yield  islice(d, gps)
        d.rotate(-stp)

输出:

In [11]:     for gp in grps(l, 3,2):
   ....:             print(" ".join(map(str,gp)))
   ....:     
1 2 3
3 4 5
5 6 7
7 8 9
9 10 1

或者只是用模:

def grps(l, gps, stp):
    ln = len(l)
    for i in range(0, len(l), stp):
        yield (l[j % ln] for j in range(i, i + gps))


for gp in grps(l, 4, 2):
    print(" ".join(map(str, gp)))

相关问题 更多 >