簡體   English   中英

如何創建具有 3 個元素的子列表,但是如果子列表只有一個元素,則改為創建兩個具有 2 個元素的子列表?

[英]How to create sub-lists with 3 elements, but if a sub-list gets a single element then instead create two with 2 elements?

以下示例闡明了 2 元素子列表用例:

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

提前致謝。

怎么樣:

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']]

這是使用迭代器的解決方案:

L = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] 
N = len(L)
I = iter(L) 
[[next(I) for _ in range(size)] for size in [3]*(N//3-1) + ([3] if (N%3)==0 else ([2,2] if (N%3)==1 else [3,2]))] 
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H'], ['I', 'J']]

我會做一個 function:

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')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM