You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:48:43