2017-08-17 58 views
2

可以说我有号码的这个列表:如何使用python按升序对数字列表进行分组?

1,2,3,4,7,8,10,12,15,16,17,18,19,20,21,22,24, 26,27,29

我希望根据在列表中递增顺序来创建5个连基团:

组1:1,2,3,4,7

组2 :8,10,12,15,16

组3:17,18,19,20,21

等等

我可以使用Python来做到这一点?我知道我可以按0:4分组; 5:9 ...但我有很多不同长度的列表,我需要将它们分成5组。

回答

4

你可以试试这个:

l = [1, 2, 3, 4, 7, 8, 10, 12, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 29] 

new_groups = [l[i:i+5] for i in range(0, len(l), 5)] 

输出:

[[1, 2, 3, 4, 7], [8, 10, 12, 15, 16], [17, 18, 19, 20, 21], [22, 24, 26, 27, 29]] 

如果您想通过数字来访问每个组,可以构建一个字典:

accessing = {i+1:a for i, a in zip(range(5), new_groups)} 

print(acessing[2]) 

输出:

[8, 10, 12, 15, 16] 
0

你可以根据列表的长度来做到这一点。

l = [...] 
groupLength = len(l) // 5 
groups = [l[i*groupLength:(i+1)*groupLength] for i in range(5)] 

然后要么完成与其余元素的最后一组:

groups[-1].extend(l[-len(l)%5:]) 

或者干脆把剩下的元素融入到新组:

groups.append(l[-(len(l)%5):]) 
2

排序列表,然后使用来自itertoolsgrouper配方:

from itertools import zip_longest 
l = [1, 2, 3, 4, 7, 8, 10, 12, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 29] 
l.sort() 

def grouper(iterable, n, fillvalue=None): 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

groups = list(grouper(l, 5)) 
print(groups) 
# [(1, 2, 3, 4, 7), (8, 10, 12, 15, 16), (17, 18, 19, 20, 21), (22, 24, 26, 27, 29)] 
相关问题