Python combinations 的位置身份:输入只有两种字母,为什么同一对结果会出现两次
从 A、A、B 中取两个元素,combinations 会交出一次 AA 和两次 AB。看到重复 AB 后直接认定库函数没有去重,会漏掉问题本身:两个 A 位于不同位置,可以代表两张独立卡片,也可以代表同一个类别的重复录入。需要先确定组合的对象。
下面同时保留原值与输入编号,并比较两种去重时机。保存为 demo.py,运行 python demo.py。示例只有三个字符,所有组合都可以直接看完;没有读取外部数据。
AI模型生成概念示意:两个相同圆形分别占据独立位置,位置标记使它们可以被分别选择;不是程序输出截图。
from itertools import combinations
from math import comb
values = ["A", "A", "B"]
pairs = list(combinations(values, 2))
print("value pairs:", pairs)
assert pairs == [("A", "A"), ("A", "B"), ("A", "B")]
assert len(pairs) == comb(len(values), 2) == 3
indexed = list(combinations(enumerate(values), 2))
positions = [tuple(index for index, value in pair) for pair in indexed]
print("positions:", positions)
assert positions == [(0, 1), (0, 2), (1, 2)]
unique_input = list(dict.fromkeys(values))
before = list(combinations(unique_input, 2))
after = list(dict.fromkeys(pairs))
print("deduplicate input:", before)
print("deduplicate output:", after)
assert before == [("A", "B")]
assert after == [("A", "A"), ("A", "B")]
print("choose zero:", list(combinations(values, 0)))
print("choose too many:", list(combinations(values, 4)))
assert list(combinations(values, 0)) == [()]
assert list(combinations(values, 4)) == []不重复使用位置,不等于不出现相同值
value pairs 打印 [('A', 'A'), ('A', 'B'), ('A', 'B')]。对应的 positions 是 [(0, 1), (0, 2), (1, 2)]。两次 AB 分别取了第一个 A 和第二个 A;任何一对都没有重复选取同一个位置。
三项取二项,共有三种位置选择,与 math.comb(3, 2) 一致。若 A 是两件外观相同的库存物品,两次 AB 可以是不同的实际方案。为了让结果可追溯,应像示例一样保留编号,或者直接让输入包含稳定的物品标识,而不是最后只留下显示名称。
去重发生在哪一步,会改变可选方案
deduplicate input 只有 [('A', 'B')]。先去重后,输入变成 A、B,各有一个位置,所以 AA 已经不可能出现。deduplicate output 则保留 [('A', 'A'), ('A', 'B')]:它仍允许从原来两张 A 组成一对,只合并显示内容相同的结果。
这两种操作解决不同业务问题,不能互相替代。先去重适合从不同类别中选类别;后去重适合只关心可形成的值模式。示例用 dict.fromkeys 保留首次出现顺序,且元素是可哈希字符串;若元素是列表或字典,要另外定义稳定的比较键。
choose zero: [()] 代表恰有一种“什么也不选”的组合;choose too many: [] 则表示无法从三个位置选出四个位置。前者有一个空元组,后者没有任何结果。汇总时把两者都当作失败,会丢掉组合算法中有用的边界情况。
结果顺序遵循输入位置顺序,不会替你按业务名称排序。对于大型输入,组合数量增长很快,事后去重仍需先处理许多重复候选。应先估算数量并明确是否真的区分位置,再选择算法;不要为了去重直接把海量输出全部塞进集合。
资料核对日期:2026年10月2日。代码在本地 Python 3.12.14 实际运行并通过断言;结果对应文中固定输入。


