如何创建具有3个元素的子列表,但是如果一个子列表只有一个元素,则创建两个具有2个元素的子列表?

时间:2019-10-25 19:43:01

标签: python

通过一个示例来阐明2个元素子列表的用例:

如果一个列表包含10个元素[A, B, C, D, E, F, G, H, I, J],我想得到4个子列表:[[A, B, C], [D, E, F], [G, H], [I, J]]

谢谢。

3 个答案:

答案 0 :(得分:2)

我会做一个功能:

def partition(a):
    arr = np.array(a)
    n = len(arr) # assume that n>=3

    r = n % 3
    if r == 0:
        return list(arr.reshape(-1, 3))
    if r == 1:
        return list(arr[:-4].reshape(-1,3)) + list(arr[-4:].reshape(-1,2))

    # r == 2
    return list(arr[:-2].reshape(-1,3)) + [arr[-2:]]

测试:

partition(list('ABCDEFGHIJ'))
# [array(['A', 'B', 'C'], dtype='<U1'), array(['D', 'E', 'F'], dtype='<U1'),  
# array(['G', 'H'], dtype='<U1'), array(['I', 'J'], dtype='<U1')]

partition(list('ABCDEFGHI'))
# [array(['A', 'B', 'C'], dtype='<U1'), array(['D', 'E', 'F'], dtype='<U1'),
# array(['G', 'H', 'I'], dtype='<U1')]

partition(list('ABCDEFGH'))
# [array(['A', 'B', 'C'], dtype='<U1'), array(['D', 'E', 'F'], dtype='<U1'),
# array(['G', 'H'], dtype='<U1')]

答案 1 :(得分:2)

怎么样:

l = list('ABCDEFGHIJ')
n = len(l)
res = [ l[(i if i < n-1 else i-1) : (i+3 if i < n-4 or i == n-3 else i+2)] for i in range(0,n,3)]
print(res)

这将提供以下输出:

[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H'], ['I', 'J']]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K', 'L']]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K'], ['L', 'M']]

答案 2 :(得分:2)

这是使用迭代器的解决方案:

struct Resource
{
    std::variant<int, std::wstring> lpType;
    std::variant<int, std::wstring> lpName;
    HANDLE lpData;
    DWORD dwSize;
};