Python实现:从字典嵌套列表值中提取元素对出现模式
Python 元素对出现模式统计问题
输入字典
d = { 'A': [[1,2,7]], 'B': [[1,3,7], [1,3], [1,7]], 'C': [[1,3,7], [2,6]], 'D': [[1,3,2], [2,1,3]] }
期望输出
{ (2,7): ['A'], (3,7): ['C'], (2,6): ['C'], (2,3): ['D'], (1,2): ['A','D'], (1,7): ['A','B','C'], (1,3): ['B','C','D'] }
规则说明
- 输出字典的键为升序排列的元素对,对应原字典子列表中存在的两个元素组合;
- 输出字典的值为原字典中所有包含该元素对的子列表对应的键的列表(同一个原键仅记录一次,即便其多个子列表包含同一元素对);
- 示例:元素对
(1,3)存在于B、C、D的子列表中,对应值为['B','C','D'];元素对(2,7)仅存在于A的子列表中,对应值为['A']。
实现代码
from itertools import combinations d = { 'A': [[1,2,7]], 'B': [[1,3,7], [1,3], [1,7]], 'C': [[1,3,7], [2,6]], 'D': [[1,3,2], [2,1,3]] } result = {} for main_key, sublists in d.items(): processed_pairs = set() for sublist in sublists: # 对子列表排序,确保元素对格式统一 sorted_sublist = sorted(sublist) # 生成所有不重复的2元素组合 for pair in combinations(sorted_sublist, 2): if pair not in processed_pairs: processed_pairs.add(pair) # 更新结果字典 if pair in result: result[pair].append(main_key) else: result[pair] = [main_key] # 按元素对自然顺序排序,匹配示例输出格式 final_result = dict(sorted(result.items())) print(final_result)
代码说明
- 用
itertools.combinations生成子列表的所有2元素组合,先对子列表排序,避免(1,2)和(2,1)被当作不同键; - 每个原字典键下维护
processed_pairs集合,防止同一键被重复添加到同一元素对的列表中; - 最后对结果字典按键排序,输出格式与示例一致。
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

