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