Python中如何从列表的列表生成长度为2的组合?
嘿,这个需求很清晰!你要的是从不同子列表中各取一个元素组成的长度为2的所有可能组合,对吧?既然你已经在用itertools处理笛卡尔积了,咱们可以基于这个模块轻松实现,分两种常见情况给你说明:
情况1:需要保留有序对(比如('a0','b0')和('b0','a0')都算不同组合)
这种场景的核心逻辑是:先选出所有两两不同的子列表组合,再对每对子列表做笛卡尔积——因为笛卡尔积会生成两个子列表元素的所有有序配对,同时自动避免从同一个子列表取元素。
代码示例:
import itertools # 你的原始列表 list_of_lists = [['a0', 'a1'], ['b0', 'b1'], ['c0', 'c1', 'c2']] all_ordered_pairs = [] # 第一步:生成所有两两不同的子列表组合(比如[['a0','a1'], ['b0','b1']]是一组) for sublist_pair in itertools.combinations(list_of_lists, 2): # 第二步:对当前子列表组做笛卡尔积,得到所有有序元素对 all_ordered_pairs.extend(itertools.product(*sublist_pair)) print(all_ordered_pairs)
运行后会得到你需要的完整有序对集合,比如:
[('a0', 'b0'), ('a0', 'b1'), ('a1', 'b0'), ('a1', 'b1'), ('a0', 'c0'), ('a0', 'c1'), ('a0', 'c2'), ('a1', 'c0'), ('a1', 'c1'), ('a1', 'c2'), ('b0', 'c0'), ('b0', 'c1'), ('b0', 'c2'), ('b1', 'c0'), ('b1', 'c1'), ('b1', 'c2')]
情况2:需要无序组合(只保留('a0','b0'),排除反向的('b0','a0'))
如果希望每个跨子列表的元素对只出现一次,可以先生成所有有序对,再通过“标准化”(比如排序)去重:
import itertools list_of_lists = [['a0', 'a1'], ['b0', 'b1'], ['c0', 'c1', 'c2']] seen_pairs = set() all_unique_pairs = [] for sublist_pair in itertools.combinations(list_of_lists, 2): for pair in itertools.product(*sublist_pair): # 将对排序后转成元组,这样反向对会被识别为同一个值 normalized_pair = tuple(sorted(pair)) if normalized_pair not in seen_pairs: seen_pairs.add(normalized_pair) all_unique_pairs.append(normalized_pair) print(all_unique_pairs)
要是你的元素是不可排序的自定义对象,也可以用frozenset(pair)来代替排序,同样能实现去重效果。
内容的提问来源于stack exchange,提问作者randomprogrammer
相关产品推荐
相关产品推荐

