Python中combinations函数与集合互异性导致的排列组合差异解析

橘子海
橘子海
发布时间:2026-10-13| 4人浏览过
原创

本文通过实际案例解析Python中itertools.combinations函数的行为差异。当输入数据为集合(使用大括号{})时,因集合的互异性会自动去重,导致排列组合结果与预期不符;而使用列表(中括号[])则保留重复元素,符合基于位置的唯一性判断逻辑。文章详细展示了从困惑到定位问题的过程,强调理解Python基础数据结构特性的重要性。

许久未更新博客。昨日小牛在上海举办牛友见面会,现场优惠力度较大,因心仪已久且一时冲动便购买了。然而,购后并未感到预期的喜悦,反而充满焦虑:担忧电动车被盗、电池被偷,甚至害怕在路上遭遇交警拦截。这种焦虑似乎只有等到车辆真正被盗时才会消失。对此,我只能无奈苦笑。

接下来进入正题:

今日协助王博处理专利数据时,需统计专利数据中城市与专利主体间的合作关系数量。一项专利的写作主体可能由两个或更多主体构成,各主体分属不同或相同城市。统计合作关系数量,实质上是对主体及城市进行排列组合。Python的itertools库提供了combinations方法,可轻松实现排列组合。在此之前,我先编写了一个简单的测试代码,如下所示:

from itertools import combinations
test_data = {'a', 'a', 'a', 'b'}
for i in combinations(test_data, 2):
 print i

上述代码执行后的输出结果为:

('a', 'b')

该输出结果令我感到困惑,我预期的结果应为:

('a', 'a')
('a', 'a')
('a', 'b')
('a', 'a')
('a', 'b')
('a', 'b')

同一专利中的主体不会出现重复,但主体所在的城市可能出现重复。若使用combinations进行排列组合时主动忽略重复值,则需自行实现城市的排列组合。自行实现虽不难,但这似乎不符合Python的风格。再次审查测试代码,突然意识到构造的输入数据可能存在错误。

随后将代码修改为如下形式:

from itertools import combinations
test_data = ['a', 'a', 'a', 'b']
for i in combinations(test_data, 2):
 print i

将大括号替换为中括号后,输出结果与预期完全一致!这令我深感困惑。官方文档对combinations方法的说明指出:Elements are treated as unique based on their position, not on their value.,意为combinations处理传入的可迭代参数时,依据元素的位置确定唯一性,而与元素的值是否唯一无关。那么,使用{}和[]构建的输入数据有何不同?本意是记录此问题以寻求高手解答或日后查证,但在整理思路的过程中,竟找到了原因!

其实原理很简单:使用大括号{}创建的是集合或字典,而使用中括号[]创建的是数组。关键在于,集合具有互异性!

因此,无论我在{}中输入多少个'a',传入combinations方法的参数值实际上仅为:'a', 'b'。得知真相后感到十分尴尬,本以为遇到了深奥的问题,实则因Python基础知识欠缺所致。此事令人不好意思将博客发布出来(捂脸)。

以上关于Python使用combinations实现排列组合的方法即为全部内容,希望能提供参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。