python排列和组合

273 阅读1分钟

1 排列

test.py

from itertools import permutations

a = [1, 2, 3]
b = list(permutations(a, 1))
print(len(b), b)
b = list(permutations(a, 2))
print(len(b), b)
b = list(permutations(a, 3))
print(len(b), b)

result

3 [(1,), (2,), (3,)]
6 [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
6 [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
  • 数学表达式
len(permutations([1, 2, 3, 4], 4)) = 4*3*2*1 = 4!

2 组合

test.py

from itertools import combinations

a = [1, 2, 3]
b = list(combinations(a, 1))
print(len(b), b)
b = list(combinations(a, 2))
print(len(b), b)
b = list(combinations(a, 3))
print(len(b), b)

result

3 [(1,), (2,), (3,)]
3 [(1, 2), (1, 3), (2, 3)]
1 [(1, 2, 3)]
  • 数学表达式
总数为 3+3+1 = 7 = 2的len(a)次幂-1 = 2**3-1

3 组合后的条件判断

test.py

from itertools import combinations

a = [x for x in range(1, 5)]
items = []
for i in range(0, len(a)):
    items += list(combinations(a, i + 1))

print(len(items), items)
for item in items:
    for i in item:
        if i:
            pass
        else:
            pass
        # print(item, i)

result

15 [(1,), (2,), (3,), (4,), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (1, 2, 3, 4)]
  • 业务场景:有个搜索接口有4个过滤搜索条件,均可以为None,在编写测试用例的时候,想要全场景覆盖,就需要使用组合穷举出可能的结果,然后进行断言 assert.