列表列表转换为具有条件的特定长度的列表列表

List of lists into a list of lists of a specific length with condition

data = [
    
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    'customers/2309565764/assets/34830515300'
    ],
     
    ['customers/2309565764/assets/34830515303', 
    'customers/2309565764/assets/34830473309', 
    'customers/2309565764/assets/34830508136', 
    'customers/2309565764/assets/34830515336'], 

    ['customers/2309565764/assets/20029085042', 
    'customers/2309565764/assets/20033811553', 
    'customers/2309565764/assets/20065471524', 
    'customers/2309565764/assets/20029089104'], 

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/11111', 
    'customers/2309565764/assets/22222', 
    'customers/2309565764/assets/33333', 
    ],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],

    ['customers/2309565764/assets/20033813263', 
    'customers/2309565764/assets/20065476771', 
    'customers/2309565764/assets/20029091753', 
    'customers/2309565764/assets/20029091369'],
    ]

我想从中得到什么

相同的列表列表,但每个内部列表的项目不得超过 20 个。它最终看起来像这样

[
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    ....
    20th element],
    
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    ....
    20th element],
    
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    ....
    last element],
    
    ]

使用此代码

result = []
transitional_data = []
for i in data:
    if len(transitional_data) + len(i) <= 20:
        for j in i:
            transitional_data.append(j)
    else:
        result.append(transitional_data)
        transitional_data = []
print(result)    

我最终只有一个嵌套列表而不是 3 个(其中两个将有 20 个元素,一个有 4 个剩余元素)

[
    ['customers/2309565764/assets/34830517871', 
    'customers/2309565764/assets/34827154141', 
    'customers/2309565764/assets/34856605170', 
    ....
    20th element],  
] 

重要 数据中嵌套列表的条件 - 嵌套列表的元素不能分开,例如

的前两个元素
['customers/2309565764/assets/34830517871', 
'customers/2309565764/assets/34827154141', 
'customers/2309565764/assets/34856605170', 
'customers/2309565764/assets/34830515300'
],

第一个子列表进不去,另外两个进不了另一个。原始嵌套列表中可以有 <= 4 个项目。

更新 我更新了输入数据,现在第 5 个嵌套列表包含 3 个元素。如果我 运行

flat_list = [item for sublist in data for item in sublist]
partitioned_list = [flat_list[i:i + 20] for i in range(0, len(flat_list), 20)] 

结果数据包含 3 个嵌套列表 - 这就是我需要得到的。但是第 6 个嵌套列表的第一个元素在第一个结果子列表中,另外 2 个在第二个结果子列表中

这是考虑到特殊情况的版本。我简化了数据列表中的值,以便更容易读取输入和输出。

data = [
    ['1', '2', '3', '4'],
    ['5', '6', '7', '8'],
    ['9', '10', '11', '12'],
    ['13', '14', '15', '16'],
    ['17', '18', '19'],

    ['20', '21', '22', '23'],
    ['24', '25', '26', '27'],
    ['28', '29', '30', '31'],
    ['32', '33', '34', '35'],
    ['36', '37', '38', '39'],

    ['40', '41', '42', '43']
]


def combine(original_list, maxlen=20):
    outer_list = []
    accum = []

    for sublist in original_list:
        # if the next set of values will fit, extend the sublist
        if len(accum) + len(sublist) <= maxlen:
            accum.extend(sublist)
        else:
            # otherwise start a new sublist
            outer_list.append(accum)
            accum = list(sublist)

    # pick up any values that are left over
    if accum:
        outer_list.append(accum)

    return outer_list

new_list = combine(data)
print(new_list)

根据 Stef 评论中的想法,这会在列表中累积值,直到达到最大长度,但不会拆分原始输入中的子列表。

输出:

[['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
['20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39'],
['40', '41', '42', '43']]