可以说我有号码的这个列表:如何使用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组。
可以说我有号码的这个列表:如何使用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组。
你可以试试这个:
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]
你可以根据列表的长度来做到这一点。
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):])
排序列表,然后使用来自itertools
的grouper
配方:
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)]