2016-08-25 41 views
2

我需要能够将一个整数分成一个长度均匀的列表。如何在Python 3.5中将一个整数分成n个长度的列表?

例如N = 4,

12 -> [0, 0, 1, 2] 
1234 -> [1, 2, 3, 4] 
12345 -> [1, 2, 3, 45] 
123456 -> [1, 2, 34, 56] 
1234567 -> [1, 23, 45, 67] 
12345678 -> 12, 34, 56, 78] 
123456789 -> [12, 34, 56, 789] 

我敢肯定,我用的我已经给实例的个数就矫枉过正,但它会帮助传达出点。

,我在过去使用的项目分成列出的代码是:

def split(s, chunk_size): 
    a = zip(*[s[i::chunk_size] for i in range(chunk_size)]) 
    return [''.join(t) for t in a] 

但是这个代码仅闯入正块。 (来自StackOverflow的代码,我不记得确切的帖子,对不起)。

感谢您的帮助。

回答

4
def split(seq, n): 
    """Partitions `seq` into `n` successive slices of roughly equal size. 

    The sizes of each yielded slice shall differ by at most one. 
    """ 
    q, r = divmod(len(seq), n) 
    start = 0 

    for i in range(n): 
     size = q + (i < r) 
     yield seq[start : start + size] 
     start += size 

它基本上的工作方式为this popular answer一样的,只不过它均匀地分配剩余到每个ñ片。

不幸的是,这将分配到列表的头部。要调整它为你的情况,你需要改变size = q + (i < r)喜欢的东西:

size = q + (i >= (n - r)) 

随着这一变化,如下:

print(list(split('1234', 4))) 
print(list(split('12345', 4))) 
print(list(split('123456', 4))) 
print(list(split('1234567', 4))) 
print(list(split('12345678', 4))) 
print(list(split('123456789', 4))) 

打印:

['1', '2', '3', '4'] 
['1', '2', '3', '45'] 
['1', '2', '34', '56'] 
['1', '23', '45', '67'] 
['12', '34', '56', '78'] 
['12', '34', '56', '789'] 
+0

当我使用该功能并复制打印件时,我得到如下结果:['1','2','3','4'], [ '12','3','4','5'], ['12','34','5','6'], ['12','34','56',' '7'], ['12','34','56','78'], ['123','45','67','89']。 – AustinB

+1

@AustinB在复制+粘贴之前请完整阅读答案。 –

+0

啊谢谢,我现在很累,只需要快速完成我的项目的一部分。谢谢您的帮助。 – AustinB

-1

遗憾 - 有故障代码 它正在按照规范

def split(s, list_size): 
    s = str(s) 
    assert len(s) >= list_size, "assertion failed" 
    r, rem = divmod(len(s), list_size) 
    lst = [] 
    for i in range(list_size): 
     lst.append(s[i*r:(i+1)*r]) 
    for j in range(rem): 
     lst[-(j+1)] += s[list_size + j] 
    return lst 
+0

这将失败,'1234567'情况。 – Selcuk

+0

将整个剩余部分推入最终元素,是不是?这些例子表明其余的部分展开; 7个项目拆分4种方式产生长度为1,2,2,2,而不是1,1,1,4的元素。 – ShadowRanger

+0

现在该错误已被修复 –

1

变上阿赫桑的答案应该正确地分配到序列末尾的剩余部分:

from itertools import accumulate 

def split(s, parts): 
    s = str(s) 
    r, rem = divmod(len(s), parts) 
    norem = parts - rem 
    counts = [r]*norem + [r+1]*rem 
    # Prepend 0 to counts only for accumulate to start from 0 
    return [s[start:start+cnt] for start, cnt in zip(accumulate([0] + counts), counts)] 
0

选择的答案有它的优势,但我做到了更直接的方式:

def chunk(s, n): 
    return [s[i:i+n] for i in range(0, len(s), n)] 

def split(s0, numberOfChunks): 
    s = ('0' * max(0, numberOfChunks - len(s0))) + s0 
    sizeOfChunk = len(s)/numberOfChunks 
    numberOfSmallChunks = numberOfChunks - len(s) % numberOfChunks 
    return chunk(s[:numberOfSmallChunks * sizeOfChunk], sizeOfChunk) + 
      chunk(s[sizeOfChunk*numberOfSmallChunks:], sizeOfChunk+1) 
相关问题