生成可迭代对象中所有可能的组合,不考虑顺序:
python
from itertools import combinations
combinations(iterable, r)
其中iterable是可迭代对象,如列表元组字符串等
r是每个组合包含的元素个数
如 items = ['A', 'B', 'C', 'D']
print(list(combinations(items, 2)))
# 输出: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
print(list(combinations(items, 3)))
# 输出: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')]
但是相同的元素会被视为不同的位置:
print(list(combinations('AAA', 2)))
# 输出: [('A', 'A'), ('A', 'A'), ('A', 'A')]
常见用法
1.生成点对
python
points = [(1, 2), (3, 4), (5, 6), (7, 8)]
for (x1, y1), (x2, y2) in combinations(points, 2):
distance = ((x2 - x1)**2 + (y2 - y1)**2)**0.5
print(f"点({x1},{y1}) 和 点({x2},{y2}) 的距离: {distance:.2f}")
2.与zip结合生成矩阵对:
python
# 原始问题中的用法
bottomLeft = [[1, 1], [2, 2], [3, 3]]
topRight = [[4, 4], [5, 5], [6, 6]]
# 将两个列表对应元素配对
rects = list(zip(bottomLeft, topRight))
# rects = [([1, 1], [4, 4]), ([2, 2], [5, 5]), ([3, 3], [6, 6])]
# 生成所有矩形对
for rect1, rect2 in combinations(rects, 2):
print(f"矩形1: {rect1}, 矩形2: {rect2}")
3.与set结合,获得唯一组合
python
data = [1, 2, 2, 3]
unique_combos = set(combinations(sorted(data), 2))
print("唯一组合:", unique_combos)
# 输出: {(1, 2), (1, 3), (2, 2), (2, 3)}
如果考虑排列顺序呢?用permutations
python
from itertools import permutations
items = ['A', 'B', 'C']
print(list(permutations(items, 2)))
# 输出: [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]