如何将元素列表转换为与目标元组列表结构匹配的元组列表?
问题
给定两个列表:
L = [("a0","a1"),("b0",),("b1","a1","b0"),("a0","a1"),("b0",)] M = ["u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7" , "u8"]
需要将列表M的元素分组为元组列表N,满足以下两个条件:
- 每个元组的长度与
L中对应位置的元组长度完全匹配,即all(len(L[i]) == len(N[i]) for i in range(len(L))) - 将
N展开后得到的列表与M完全一致,即M == [item for t in N for item in t]
最终期望生成的N为:
N = [("u0", "u1"), ("u2",), ("u3", "u4", "u5"), ("u6", "u7") , ("u8",)]
解决方案
方法一:使用迭代器(推荐)
借助Python迭代器的特性,逐个从M中提取对应长度的元素组成元组,无需提前计算索引,代码简洁且内存效率更高:
L = [("a0","a1"),("b0",),("b1","a1","b0"),("a0","a1"),("b0",)] M = ["u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7" , "u8"] it = iter(M) N = [tuple(next(it) for _ in range(length)) for length in map(len, L)] print(N)
运行输出:
[('u0', 'u1'), ('u2',), ('u3', 'u4', 'u5'), ('u6', 'u7'), ('u8',)]
方法二:通过切片索引分组
通过累计长度的方式,确定每个元组在M中的切片范围,逻辑直观易懂:
L = [("a0","a1"),("b0",),("b1","a1","b0"),("a0","a1"),("b0",)] M = ["u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7" , "u8"] current_idx = 0 N = [] for elem in L: group_len = len(elem) N.append(tuple(M[current_idx:current_idx + group_len])) current_idx += group_len print(N)
运行结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

