数组内两两配对问题
有一个数组,想求出所有两两配对的情况,用python怎么写比较优雅
比如输入数组是[1,2,3,4]
- 情况1
1和2配对,3和4配对 - 情况2
1和3配对,2和4配对 - 情况3
1和4配对,2和3配对
把这三种情况都求出来,两两配对没有先后顺序
- 输入
a=[1,2,3,4]
- 输出
[ [[1, 2], [3, 4]],
[[1, 3], [2, 4]],
[[1, 4], [2, 3]]
]
回答:
from itertools import combinationsprint(list(combinations([1,2,3,4],2))) #->[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
出处
- 《python cookbook》4.9 排列组合的迭代
- 《Python3.6.5标准库文档》10.1 itertools- 为高效循环创建迭代器的函数
回答:
这就是个dfs
ans = []lst = [1,2,3,4]
def dfs(lst, tmp):
if 2 == len(tmp):
ans.append(tmp)
return
for i in range(len(lst)):
dfs(lst[i+1:], tmp + [lst[i]])
dfs(lst, [])
回答:
不知道怎么才算比较优雅,试了一下可以这样:
def dfs(ls, r=2): c = []
rs = []
for x in itertools.combinations(ls, r):
c.append(list(x))
for i, j in itertools.combinations(c, r=2):
x_set = set()
x_set.update(i)
x_set.update(j)
x_rs = []
if len(ls) == len(x_set):
x_rs.append(i)
x_rs.append(j)
rs.append(x_rs)
return rs
print("[1, 2, 3, 4]的结果=>", dfs(ls=[1, 2, 3, 4], r=2))
print("[1, 2, 3, 4, 5, 6]的结果=>", dfs(ls=[1, 2, 3, 4, 5, 6], r=3))
结果:
[1, 2, 3, 4]的结果=> [[[1, 2], [3, 4]], [[1, 3], [2, 4]], [[1, 4], [2, 3]]][1, 2, 3, 4, 5, 6]的结果=> [[[1, 2, 3], [4, 5, 6]], [[1, 2, 4], [3, 5, 6]], [[1, 2, 5], [3, 4, 6]], [[1, 2, 6], [3, 4, 5]], [[1, 3, 4], [2, 5, 6]], [[1, 3, 5], [2, 4, 6]], [[1, 3, 6], [2, 4, 5]], [[1, 4, 5], [2, 3, 6]], [[1, 4, 6], [2, 3, 5]], [[1, 5, 6], [2, 3, 4]]]
回答:
想了半天,for语句不知道怎么去掉,有点不优雅。
a = [1, 2, 3, 4] b = []
for i in range(1, len(a)):
b += zip(a[:-i], a[i:])
b = [list(item) for item in b]
print(b)
不知道结果是否符合要求。
[[1, 2], [2, 3], [3, 4], [1, 3], [2, 4], [1, 4]]
以上是 数组内两两配对问题 的全部内容, 来源链接: utcz.com/p/937756.html