如何根据my_list1元素出现情况从my_list2生成指定新列表?
解决方案
这问题挺清晰的,核心就是要按my_list1的元素顺序,依次从my_list2里取出每个元素下一个未被使用过的匹配项对吧?我给你个简单可行的实现思路,用字典先做个预处理,然后遍历取值就行:
实现步骤
- 先把
my_list2里的元素按第二个值(也就是p1、p2这类标识)分组,把每个标识对应的所有子列表按原顺序存起来; - 遍历
my_list1的每个元素,从对应分组里取出最前面的那个子列表,添加到新列表中。
代码实现
my_list1 = ["p1", "p2", "p4", "p1"] my_list2 = [[1,"p1"], [1,"p2"], [1,"p3"], [1,"p4"], [2, "p1"], [2, "p2"], [2, "p3"], [2, "p4"]] # 用defaultdict按p值分组存储my_list2中的匹配项 from collections import defaultdict p_matches = defaultdict(list) for item in my_list2: p_key = item[1] p_matches[p_key].append(item) # 遍历my_list1,依次取出每个p的下一个匹配项 new_list = [] for p in my_list1: # 确保当前p还有未使用的匹配项,避免索引错误 if p_matches.get(p, []): new_list.append(p_matches[p].pop(0)) # 验证结果 print(new_list) # 输出: [[1, 'p1'], [1, 'p2'], [1, 'p4'], [2, 'p1']]
补充说明
- 这里用
collections.defaultdict是为了简化分组逻辑,如果不想引入额外依赖,也可以用普通字典手动初始化分组:p_matches = {} for item in my_list2: p_key = item[1] if p_key not in p_matches: p_matches[p_key] = [] p_matches[p_key].append(item) - 如果
my_list1里出现了my_list2中没有的p值,或者某个p的出现次数超过了my_list2中的匹配次数,代码里的if p_matches.get(p, [])会跳过这些情况,你也可以根据需求添加报错提示或者默认值处理。
内容的提问来源于stack exchange,提问作者Benjamin Pichl
相关产品推荐
相关产品推荐

