📜  Python|根据给定的多列表重塑列表

📅  最后修改于: 2022-05-13 01:54:52.674000             🧑  作者: Mango

Python|根据给定的多列表重塑列表

给定两个列表,一个单维列表和一个多维列表,编写Python程序根据多维列表的长度重塑单维列表。

例子:

Input : list1 = [[1], [2, 3], [4, 5, 6]]
        list2 = ['a', 'b', 'c', 'd', 'e', 'f']
Output : [['a'], ['b', 'c'], ['d', 'e', 'f']]

Input : list1 = [[8, 2, 5], [1], [12, 4, 0, 24]]
        list2 = ['m', 'n', 'o', 'p', 'q', 'r', 's', 't']
Output : [['m', 'n', 'o'], ['p'], ['q', 'r', 's', 't']]


方法#1:使用扩展切片

一个简单而天真的方法是使用 for 循环和Python扩展切片将 list2 的每个子列表附加到变量“res”。

# Python3 program to reshape a list 
# according to multidimensional list
          
def reshape(lst1, lst2):
    last = 0
    res = []
    for ele in list1:
        res.append(list2[last : last + len(ele)])
        last += len(ele)
          
    return res
  
# Driver code
list1 = [[1], [2, 3], [4, 5, 6]]
list2 = ['a', 'b', 'c', 'd', 'e', 'f']
print(reshape(list1, list2))
输出:
[['a'], ['b', 'c'], ['d', 'e', 'f']]


方法#2:来自itertools模块的islice

另一种方法是使用itertools模块中的islice函数。 islice选择性地打印在其可迭代容器中提到的值。因此,我们根据 list1 产生 list2 的切片并将其附加到变量“res”。

# Python3 program to reshape a list 
# according to multidimensional list
from itertools import islice
  
def yieldSublist(lst1, lst2):
    iter2 = iter(lst2)
    for sublist1 in lst1:
        sublist2 = list(islice(iter2, len(sublist1)))
        yield sublist2
          
def reshape(lst1, lst2):
    res = list()
    for sub2 in yieldSublist(list1, list2):
        res.append(sub2)
          
    return res
  
# Driver code
list1 = [[1], [2, 3], [4, 5, 6]]
list2 = ['a', 'b', 'c', 'd', 'e', 'f']
print(reshape(list1, list2))
输出:
[['a'], ['b', 'c'], ['d', 'e', 'f']]

方法#3:带有列表理解的Python迭代器

iter()方法返回 list2 的迭代器并将其保存在变量“iterator”中。现在根据 list1 使用列表理解重塑 list2。

# Python3 program to reshape a list 
# according to multidimensional list
  
def reshape(lst1, lst2):
    iterator = iter(lst2)
    return [[next(iterator) for _ in sublist] 
                         for sublist in lst1]
  
# Driver code
list1 = [[1], [2, 3], [4, 5, 6]]
list2 = ['a', 'b', 'c', 'd', 'e', 'f']
print(reshape(list1, list2))
输出:
[['a'], ['b', 'c'], ['d', 'e', 'f']]