说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.combinations(iterable, r)
是 Python 的 itertools 模块中的一个函数,用于生成输入可迭代对象中元素的所有可能的长度为 r 的组合。组合是无重复且无序的,这意味着 (a, b) 和 (b, a) 被认为是相同的组合,只会出现一次。
语法为 itertools.combinations(iterable, r)
返回由输入 iterable 中元素组成长度为 r 的子序列。每个元素是一个元组,元组的长度是 r 的值。
itertools.combinations(iterable, r)
参数与返回:
每个元组的组成先由序列的顺序组合,组合时先变化最后的值,如:
import itertools
chains = itertools.combinations(range(5), 3)
for i in chains:
print(i)
'''
(0, 1, 2)
(0, 1, 3)
(0, 1, 4)
(0, 2, 3)
(0, 2, 4)
(0, 3, 4)
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
'''
即使元素的值相同,不同位置的元素也被认为是不同的。
import itertools
chains = itertools.combinations([0, 0, 7], 2)
for i in chains:
print(i)
'''
(0, 0)
(0, 7)
(0, 7)
'''
如果元素各自不同,那么每个组合中没有重复元素。
语法为 itertools.combinations(iterable, r)
,返回由输入 iterable 中元素组成长度为 r 的子序列。
组合元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。
即使元素的值相同,不同位置的元素也被认为是不同的。如果元素各自不同,那么每个组合中没有重复元素。
大致相当于:
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
combinations() 的代码可被改写为 permutations() 过滤后的子序列,(相对于元素在输入中的位置)元素不是有序的。
def combinations(iterable, r):
pool = tuple(iterable)
n = len(pool)
for indices in permutations(range(n), r):
if sorted(indices) == list(indices):
yield tuple(pool[i] for i in indices)
当 0 <= r <= n
时,返回项的个数是 n! / r! / (n-r)!
;当 r > n
时,返回项个数为 0。
例如:
import itertools
it1 = itertools.combinations([1,2,3], r=2)
[*it1]
# [(1, 2), (1, 3), (2, 3)]
it2 = itertools.combinations([1,2,3], r=3)
[*it2]
# [(1, 2, 3)]
与 itertools.permutations 不同的是,itertools.combinations 不关注元素顺序,所以只关注组合。
import itertools
data = ['A', 'B', 'C']
combinations = itertools.combinations(data, 2)
for combo in combinations:
print(combo)
# 输出:
'''
('A', 'B')
('A', 'C')
('B', 'C')
'''
import itertools
data = 'ABC'
combinations = itertools.combinations(data, 2)
for combo in combinations:
print(''.join(combo))
# 输出:
'''
AB
AC
BC
'''
import itertools
data = [1, 2, 3, 4]
combinations = itertools.combinations(data, 3)
for combo in combinations:
print(combo)
# 输出:
'''
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
'''
注意事项:
假设我们有一组特征,想要选择其中的 3 个特征进行机器学习模型的训练,可以使用 itertools.combinations 生成所有可能的特征组合:
import itertools
# 特征列表
features = ['feature1', 'feature2', 'feature3', 'feature4', 'feature5']
# 生成所有长度为 3 的特征组合
combinations = itertools.combinations(features, 3)
# 打印所有特征组合
for combo in combinations:
print(combo)
# 输出:
'''
('feature1', 'feature2', 'feature3')
('feature1', 'feature2', 'feature4')
('feature1', 'feature2', 'feature5')
('feature1', 'feature3', 'feature4')
('feature1', 'feature3', 'feature5')
('feature1', 'feature4', 'feature5')
('feature2', 'feature3', 'feature4')
('feature2', 'feature3', 'feature5')
('feature2', 'feature4', 'feature5')
('feature3', 'feature4', 'feature5')
'''
通过这种方式,可以方便地生成所有可能的特征组合,进行模型训练和评估,从而选择最佳的特征子集。
更新时间:2024-07-05 07:06:00 标签:python itertools 组合