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

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

本文通过实际案例解析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 相关产品和应用

全部下载

专题列表